mybatis 整合 spring 时,mapper 是怎么被设置必要的参数的

今天看 mybatis 的 mapper 实现原理时,发现 MapperFactoryBean 中的属性  sqlSession 被无缘无故的注入了值,而 mybatis 中的 ClassPathMapperScanner#doScan 方法并没有为 BeanDefinition 设置 sqlSession 的值。

经过debug跟踪源码发现 spring 装配bean的过程中,经过 AbstractAutowireCapableBeanFactory#populateBean 方法的调用后就会自动为 MapperFactoryBean 注入 sqlSession 的值。

继续深入代码,在 AbstractAutowireCapableBeanFactory#autowireByType 方法中发现这样一行代码: String[] propertyNames = unsatisfiedNonSimpleProperties(mbd, bw); 这里获取到数组就是 MapperFactoryBean 需要注入的属性的名称的集合,这个结果集中有两个值:sqlSessionFactory 和 sqlSessionTemplate,而 MapperFactoryBean 的父类 

SqlSessionDaoSupport 类中,刚好有两个 setter 方法:setSqlSessionFactory 和 setSqlSessionTemplate。

那么 unsatisfiedNonSimpleProperties 返回的什么样的属性呢,进入到 unsatisfiedNonSimpleProperties 方法中发现 PropertyDescriptor[] pds = bw.getPropertyDescriptors(); 然后循环遍历该数组,满足一定条件的 PropertyDescriptor 才会被返回,1、有 setter 方法。2、BeanDefinition 中没有该属性。3、属性不是简单类型(这里的简单类型包括:八种基本类型、Enum 、CharSequence 、Number 、Date 、URL、URI、Locale、Class 和 以上类型的数组)。4、没有被排除依赖检查的属性。

原文地址:https://www.cnblogs.com/wugd/p/11654362.html