• 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

     

  • 相关阅读:
    Ubuntu20.04安装Docker
    开启企业微信H5页面调试功能
    Python实现图遍历
    Linux命令整理
    BDP数据分析之高级计算
    PowerBI之DAX
    Dundas BI 简介
    tableau的高级计算
    k8s集群创建之后coredns一直处于pending状态
    Gradle打包工具入门
  • 原文地址:https://www.cnblogs.com/kevin-yuan/p/12126507.html
Copyright © 2020-2023  润新知