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方法实现。

  

  

posted @ 2023-07-25 11:40  西风51668  阅读(44)  评论(0)    收藏  举报