zoukankan      html  css  js  c++  java
  • 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

     

  • 相关阅读:
    ADFS登录界面自定义
    C# 不添加WEB引用调用WSDL接口
    C# 对象转XML 支持匿名类
    NSdata 与 NSString,Byte数组,UIImage 的相互转换
    《.NETer提高效率——环境部署》
    (五) Docker 安装 Nginx
    (六) Docker 部署 Redis 高可用集群 (sentinel 哨兵模式)
    (七) Docker 部署 MySql8.0 一主一从 高可用集群
    (八) Docker 部署 mongodb
    (四) Docker 使用Let's Encrypt 部署 HTTPS
  • 原文地址:https://www.cnblogs.com/kevin-yuan/p/12126507.html
Copyright © 2011-2022 走看看