Spring IOC 自动注入流程

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

猜你喜欢

转载自www.cnblogs.com/kevin-yuan/p/12126507.html