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