关于spring的自动注入
2024-09-16 04:47:06
关于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)方法。
最新文章
- JQuery 滚动条插件perfect-scrollbar
- Hibernate的 Restrictions用法
- [转载]jquery版小型婚礼(可动态添加祝福语)
- tomcat输出servlet-api.jar - jar not loaded 解决办法
- Android APP使用NDK编译后的ffmpeg库出现undefined reference to 'posix_memalign'错误
- 网络同步带来的bug
- lamp环境搭配(centos6.4)
- JavaBean中的get/set 的命名规范
- synchronized锁自旋
- 僵尸进程学习 &; 进程状态列表 &; Linux信号学习
- HTML5 学习笔记 1
- git推送失败的问题
- 如何使用Maven的archetype快速生成一个新项目(解决生成项目目录不完整问题)
- C#泛型委托及约束
- RadioGroup+TabHost
- OpenLayer实现路径运动
- 【技术说明】iOS10来了,AppCan已全面适配!
- linux将apache设置为系统服务和开机自启
- Python学习笔记,day3
- bzoj3277
热门文章
- 商务电话思维图(XMind für Geschäftliche Telefongespräche)
- 010-1 Socket地址族AddressFamily
- IIS 常用命令
- What is the difference between __str__ and __repr__ in Python
- step into,step over,step out.
- Swift 4 经典数据结构 Data Struct大全
- Python爬虫之12306-买票器小白源码
- 2018-2019-2 20165234 《网络对抗技术》 Exp5 MSF基础应用
- pptpd免radius限速、限连接+自由定制功能脚本
- 先安装VS后安装IIS,注册IIS方法