MyBatis-09-FactoryBean的问题
ListableBeanFactory#getBeanNamesForType(Class<?>)
这个方法的逻辑在对 FactoryBean 进行判断时,会使用 FactoryBean 的生成的对象的类型进行判断
- BD 的属性数据 AttributeAccessor.getAttribute(FactoryBean.OBJECT_TYPE_ATTRIBUTE)
- 反射创建对象并调用 FactoryBean#getObjectType
- 实例化 Bean 并调用 FactoryBean#getObjectType
那么对于 MyBatis 这种,直接实例化 MapperFactoryBean 的 getObjectType 是不会返回确定的类型的,只有1和3会返回,如果在创建 BeanDefinition
时没有 setAttribute,那么就会发生提前实例化的问题
问题又在与这个提前实例化失败时 Spring 不会抛出异常停止应用的启动,而是将底层的异常捕获并打印 debug 日志
切实遇到的问题
公司在 MyBatis-Spring 的基础上自己进行了 SpringBoot 风格的适配,但是在创建 BeanDefinition 时没有 setAttribute,导致如果
XML的Mapper啊这些写得有问题,那么 MapperFactoryBean 在实例化时会依赖相关的 MyBatis 的 Bean 的构建,当构建失败,不会停止应用。
于是产生的问题是
- Dao/Mapper 都生成了对应的 MapperFactoryBean
- getBeanNamesForType 在没有找到时会遍历它们判断
- 实例化对应的 MapperFactoryBean -> 扫描 XML 文件 -> 解析报错 -> 抑制异常
- 重复 3 直到处理完毕
于是就造成了一旦 XML 写错,控制台就会打印大量日志,给人感觉像是一直死循环处理一样的
解决方案
实际上 Spring 和 MyBatis 在后续版本已经解决了这个这个问题,就是 setAttribute,但是公司的版本没有继续迭代
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix