先看一下创建对象的doCreateBean方法
直接进入populateBean方法:
大体流程是这样的,先通过postProcessAfterInstantiation函数,该函数可以控制是否继续属性填充。然后根据byName、byType进行属性获取,放入MutablePropertyValues对象中,最后将MutablePropertyValues中的属性填充到BeanWrapper对象实例中。
if (mbd.getResolvedAutowireMode() == AUTOWIRE_BY_NAME || mbd.getResolvedAutowireMode() == AUTOWIRE_BY_TYPE) {
MutablePropertyValues newPvs = new MutablePropertyValues(pvs);
// Add property values based on autowire by name if applicable.
if (mbd.getResolvedAutowireMode() == AUTOWIRE_BY_NAME) {
autowireByName(beanName, mbd, bw, newPvs);
}
// Add property values based on autowire by type if applicable.
if (mbd.getResolvedAutowireMode() == AUTOWIRE_BY_TYPE) {
autowireByType(beanName, mbd, bw, newPvs);
}
pvs = newPvs;
}
- autowireByName没什么复杂的
- autowrieByType 这个好难
@Autowried
private List<Test> tests;
Spring会将所有与Test匹配的类型找出来并注入到tests属性中。
autowrieByType方法大概流程是这样的:首先寻找需要依赖注入的属性,获取到他们的属性名称,接着查找指定属性的set方法,这样可以知道是什么类型的属性,然后解析指定beanName的属性所匹配的值,得到属性对象后加入到MutablePropertyValues中。
最后会调用applyPropertyValues
方法
这里获取的属性是以PropertyValues形式存在的,还没有应用到实例化bean中。这个方法就是将属性注入到bean实例当中去。