关于spring的自动注入

spring里面可以设置BeanDefinition自动注入类型,默认为AUTOWIRE_NO(不进行自动注入)。mybatis里面的扫描接口生成MapperFactoryBean的时候设置了

 definition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE);

他这里是为了按类型自动注入SqlSessionFactory或者SqlSessionTemplate。

spring构造bean的时候会进行填充属性,调用了如下方法:

	protected void populateBean(String beanName, RootBeanDefinition mbd, BeanWrapper bw);

内部有一段逻辑:

if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_NAME ||
mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) {
MutablePropertyValues newPvs = new MutablePropertyValues(pvs); // Add property values based on autowire by name if applicable.
if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_NAME) {
autowireByName(beanName, mbd, bw, newPvs);
} // Add property values based on autowire by type if applicable.
if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) {
autowireByType(beanName, mbd, bw, newPvs);
} pvs = newPvs;
}

前面MapperFactoryBean的BeanDefinition已经设置成AUTOWIRE_BY_TYPE,所以会调用autowireByType方法,该方法内部逻辑为获取当前bean的所有PropertyDescriptor,并且过滤出包含有WriteMethod的PropertyNames。

获取一个bean的PropertyDescriptor示例代码如下:

public class IntrospectorTest {

    /**
* PropertyDescriptor依赖字段的set和get方法
* 没有对应的set和get方法则没有对应的read和write方法
*
* 依赖于set和get方法,跟具体的字段名没关系
*
* @throws IntrospectionException
*/
@Test
public void testPropertyDescriptors() throws IntrospectionException {
BeanInfo beanInfo = Introspector.getBeanInfo(IntrospectorTest.class);
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor pd : pds) {
if (pd.getName().equals("class")) {
continue;
}
System.out.println(pd.getName());
System.out.println(pd.getReadMethod());
System.out.println(pd.getWriteMethod());
System.out.println("********");
}
} public void setName(String name){} }

然后从获取的PropertyNames迭代,获取相应WriteMethod的入参类型,并从spring容器获取相应类型的Bean,如果获取到设置到MutablePropertyValues里。

最后调用方法:

applyPropertyValues(beanName, mbd, bw, pvs);

迭代MutablePropertyValues的PropertyValue,内部最终调用构造Bean的setXxx方法进行注入。

总结:spring的PropertyValues注入都是通过setXxx方法设置,比如xml配置的property或者BeanDefinition的getPropertyValues().add(key,value)方法。

最新文章

  1. JQuery 滚动条插件perfect-scrollbar
  2. Hibernate的 Restrictions用法
  3. [转载]jquery版小型婚礼(可动态添加祝福语)
  4. tomcat输出servlet-api.jar - jar not loaded 解决办法
  5. Android APP使用NDK编译后的ffmpeg库出现undefined reference to 'posix_memalign'错误
  6. 网络同步带来的bug
  7. lamp环境搭配(centos6.4)
  8. JavaBean中的get/set 的命名规范
  9. synchronized锁自旋
  10. 僵尸进程学习 & 进程状态列表 & Linux信号学习
  11. HTML5 学习笔记 1
  12. git推送失败的问题
  13. 如何使用Maven的archetype快速生成一个新项目(解决生成项目目录不完整问题)
  14. C#泛型委托及约束
  15. RadioGroup+TabHost
  16. OpenLayer实现路径运动
  17. 【技术说明】iOS10来了,AppCan已全面适配!
  18. linux将apache设置为系统服务和开机自启
  19. Python学习笔记,day3
  20. bzoj3277

热门文章

  1. 商务电话思维图(XMind für Geschäftliche Telefongespräche)
  2. 010-1 Socket地址族AddressFamily
  3. IIS 常用命令
  4. What is the difference between __str__ and __repr__ in Python
  5. step into,step over,step out.
  6. Swift 4 经典数据结构 Data Struct大全
  7. Python爬虫之12306-买票器小白源码
  8. 2018-2019-2 20165234 《网络对抗技术》 Exp5 MSF基础应用
  9. pptpd免radius限速、限连接+自由定制功能脚本
  10. 先安装VS后安装IIS,注册IIS方法