Spring 注解方式自动注入是通过 AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor 来处理的。
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 等
最终的注入是在 populateBean() 填充属性时进行处理的。
1. populateBean() 1.1 AutowiredAnnotationBeanPostProcessor.postProcessProperties 1.1.1 org.springframework.beans.factory.annotation.InjectionMetadata.inject 1.1.1.1 AutowiredFieldElement.inject 1.1.1.2 AutowiredMethodElement.inject 1.2 CommonAnnotationBeanPostProcessor.postProcessProperties 1.2.1 org.springframework.beans.factory.annotation.InjectionMetadata.inject 1.2.1.1 ResourceElement.inject