看mybaits源码的时候遇到一个问题,很好奇,就是MapperFactoryBean是所有mapper接口的代理包装类,而里面的核心是getSqlSession来获取mapper接口,来做代理。但是没找到SqlSessionDaoSupport里面什么时候注入的sqlSession。
所以跟了下代码,原理是这样的。
在启动的时候,mybaits扫描后会对每个BeanDefinitionHolder设值。
但我本次没有配置sqlSessionFactoryBeanName和sqlSessionTemplateBeanName的值。很好奇在做mapper代理对象的时候何时把值加回来的。
可以看到执行完代码,PropertyValues这里还是只有上面的addToCinfig一个参数。
我的mapper是@Resource的
Spring在自动装载bean的时候会进入autowireByType方法,可以留意到,在进autowireByType里面的时候,该参数还是一个addToConfig。
继续往下看
加进来以后,在bean初始化的后续过程中,会自动装载属性。此时有三个属性,属性对应的具体实例也装再进来了。(在上一步的resolveDependency做的)
再往后的话,就是利用动态代理,将值调用set方法,装载进来了。
所以,当生成mapper的代理对象MapperFactoryBean时,该值已经有了。因为MapperFactoryBean继承SqlSessionDaoSupport,所以先初始SqlSessionDaoSupport。