Spring IOC 自動注入流程


Spring 注解方式自動注入是在 populateBean() 時來完成的。
核心代碼是通過 AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor 來處理的。

doCreateBean() 時有 3 步:

1 1. org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean
2     1.1 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyMergedBeanDefinitionPostProcessors // 執行 MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition。允許 post-processors 修改 bean definition。主要是解析 bean 的依賴關系,存放到 bean definition 中
3     1.2 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean // 填充 bean 的屬性。處理依賴注入:@Value、@Autowired、@Resource 等
4     1.3 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean // 初始化 bean。執行一些初始化方法

 

第 1 步:

1 1. org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyMergedBeanDefinitionPostProcessors
2     1.1 org.springframework.beans.factory.support.MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition
3         1.1.1 org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessMergedBeanDefinition // 通過反射找到@Resource, @PostConstruct, @PreDestroy 等注解,並將這些信息保存到 bean definition 中
4         1.1.2 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessMergedBeanDefinition // 通過反射找到 @Value、@Autowired注解,並將這些信息保存到 bean definition 中    

 

1. AutowiredAnnotationBeanPostProcessor 用來支持自動注入的注解: @Autowired、@Value、@Inject(如果有的話)

注入的 bean 都會加到 RootBeanDefinition#externallyManagedConfigMembers 屬性中

org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessMergedBeanDefinition

public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName) {
    InjectionMetadata metadata = findAutowiringMetadata(beanName, beanType, null); // 通過反射找到 @Autowired、@Value、@Inject 注入元數據
    metadata.checkConfigMembers(beanDefinition); // 將注入元數據信息保存到 RootBeanDefinition#externallyManagedConfigMembers 屬性中
}

 

2. CommonAnnotationBeanPostProcessor 用來實現對常用注解的支持,主要是 javax.annotation 包中的 JSR-250 注解的支持,包括:@Resource, @PostConstruct, @PreDestroy, JNDI, EJB 等

 

第 2 步:

最終依賴注入是在 populateBean() 填充屬性時進行處理的。

1 1. populateBean()
2     1.1 AutowiredAnnotationBeanPostProcessor.postProcessProperties // 注入 @Autowired、@Value 類型的屬性
3         1.1.1 org.springframework.beans.factory.annotation.InjectionMetadata.inject
4             1.1.1.1 AutowiredFieldElement.inject
5             1.1.1.2 AutowiredMethodElement.inject
6     1.2 CommonAnnotationBeanPostProcessor.postProcessProperties // 注入 @Resource 類型的屬性
7         1.2.1 org.springframework.beans.factory.annotation.InjectionMetadata.inject
8             1.2.1.1 ResourceElement.inject

 

 

 

自動注入時,不支持 static 屬性或者 static 的 set 方法進行注入的原因:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM