spring-依赖注入
本文章基于springBoot2.7.12
首先分析下属性注入的分类
注入方式:
1、手动注入
在XML中定义bean时,通过property标签手动指定某个属性的值(也就是我们常说的set方法注入)
<bean id="person" class="com.example.boottest2.bean.Person" >
<property name="son" ref="son1" />
</bean>
源码流程:
1、通过AbstractApplicationContext的refresh方法的#290#行执行bean工厂后置处理器,实现扫描bean定义信息
2、执行PostProcessorRegistrationDelegate的invokeBeanFactoryPostProcessors方法的#79#行,实现扫描注册bean定义信息
3、执行PostProcessorRegistrationDelegate的invokeBeanDefinitionRegistryPostProcessors方法的#256#行,继续执行扫描注册bean定义信息
4、通过ConfigurationClassPostProcessor的 processConfigBeanDefinitions方法的#221#行,实现扫描注册xml里的bean定义信息
5、通过ConfigurationClassBeanDefinitionReader的loadBeanDefinitionsForConfigurationClass方法的#101#行,扫描注册person的bean定义信息,并最终把person里的属性设置到GenericBeanDefinition的propertyValueList中

6、通过AbstractAutowireCapableBeanFactory的doCreateBean方法的#619#行,实现属性注入
7、通过AbstractAutowireCapableBeanFactory的populateBean方法的#1406#行,获取person里的依赖属性PropertyValues

8、最终通过AbstractAutowireCapableBeanFactory的populateBean方法的#1452#行,实现person属性注入。
if (pvs != null) {
applyPropertyValues(beanName, mbd, bw, pvs);
}
在XML中定义bean时,通过constructor标签手动指定构造函数里的参数值(也就是我们常说的构造函数注入)
<bean name="userService" class="com.yulong.service.UserService">
<constructor‐arg index="0" ref="orderService"/>
</bean>
2、自动注入
XML中定义bean时,通过autowire实现自动注入(autowire值包含:byType,byName,constructor,default,no)
byType和byName需要有set方法,constructor需要有构造方法
<bean id="orderService" class="com.yulong.service.orderService" autowire="byType"/>
@Bean通过autowire(autowire值包含:Autowire.BY_TYPE,Autowire.BY_NAME,Autowire.AUTOWIRE_NO)实现自动注入
@Bean(autowire = Autowire.BY_TYPE)
public Person person(){
return new Person();
}
@Bean
public Son son(){
return new Son();
}
代码原理:
1、通过AbstractAutowireCapableBeanFactory的doCreateBean方法的#619#行,实现依赖属性注入
2、继续通过AbstractAutowireCapableBeanFactory的populateBean方法的#1409#行,获取MutablePropertyValues
if (resolvedAutowireMode == AUTOWIRE_BY_NAME || resolvedAutowireMode == AUTOWIRE_BY_TYPE) {
MutablePropertyValues newPvs = new MutablePropertyValues(pvs);
// xml里的autowire=byName或 @Bean(autowire = Autowire.BY_NAME)
if (resolvedAutowireMode == AUTOWIRE_BY_NAME) {
autowireByName(beanName, mbd, bw, newPvs);
}
// xml里的autowire=byType或 @Bean(autowire = Autowire.BY_TYPE)
if (resolvedAutowireMode == AUTOWIRE_BY_TYPE) {
autowireByType(beanName, mbd, bw, newPvs);
}
pvs = newPvs;
}
3、再通过AbstractAutowireCapableBeanFactory的populateBean方法的#1452#行,实现依赖属性注入
if (pvs != null) {
applyPropertyValues(beanName, mbd, bw, pvs);
}
通过@Autowire,@Value,@Inject,@Resource实现自动注入
1、在bean生命周期中:bean工厂后置处理器扫描注册beandefinition =>实例化前 =>实例化 =>寻找注入点 =>实例化后 =>属性赋值 =>aware方法回调 =>初始化前 =>初始化 =>初始化后
2、那么针对@Autowire,@Value,@Inject,@Resource,则通过AbstractAutowireCapableBeanFactory的doCreateBean的方法的#594#行寻找注入点,具体通过MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition的实现,查找注入点,以@Autowire为例:
3、通过AutowiredAnnotationBeanPostProcessor的postProcessMergedBeanDefinition方法的#246#行,获取InjectionMetadata注入点
4、获取InjectionMetadata注入点并缓存到injectionMetadataCache,具体通过AutowiredAnnotationBeanPostProcessor的findAutowiringMetadata方法的#453#行实现
5、通过AbstractAutowireCapableBeanFactory的doCreateBean方法的#619#行,实现属性注入。
6、通过AbstractAutowireCapableBeanFactory的populateBean方法的#1431#行,调用bean后置处理器的属性注入。
7、调用AutowiredAnnotationBeanPostProcessor的postProcessProperties方法的#397#行,从缓存injectionMetadataCache获取InjectionMetadata注入点。
8、调用InjectionMetadata的inject方法的#119#行,实现属性注入。
9、属性注入具体通过AutowiredAnnotationBeanPostProcessor的内部类(AutowiredFieldElement和AutowiredMethodElement)
的inject方法实现。

浙公网安备 33010602011771号