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

