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 方法进行注入的原因:

 

posted on 2019-12-31 19:02  快鸟  阅读(1228)  评论(0编辑  收藏  举报