zoukankan      html  css  js  c++  java
  • Spring源码分析-bean创建(流程图)

    bean的生命周期把它总结为以下几个阶段
    • 实例化
    • 属性注入/依赖注入
    • 初始化
    • 销毁
    其中实例化、属性注入、初始化属于bean创建的过程。

    bean创建的过程流程图
    (1)当spring容器在启动的时候或者启动完成后显示调用getBean方法时来获取bean实例的时候,都会调用这个doGetBean方法
    • doGetBean方法首先通过调用getSingleton判断这个bean能不能拿到,如果可以直接返回;
    • doGetBean会根据不同的作用域,执行不同的操作
     
    (2)Bean的创建,主要是通过调用doCreateBean方法
    1. 实例化,调用createBeanInstance方法
    2. 属性注入,调用populateBean方法
    3. 初始化,调用initializeBean方法
     
    (3)实例化,主要是通过调用createBeanInstance,又分两步:
    1. 通过resolveBeanClass获取beanClass对象,如果此类之前加载过直接返回,如果没有加载过则通过ClassLoader加载;
    2. 实例化,通过无参构造方式实例化或通过@Autowire注解的构造方法实例化
     
    (4)属性注入,主要是通过调用populateBean方法
    1. 通过AutowiredFieldElement或AutowiredMethodElement调用inject方法
    2. bean注入最终又会调用getBean方法(循环依赖产生的地方)
    3. 拿到bean对象后,通过反射完成属性注入
     
    (5)初始化,主要是通过调用initializeBean方法(初始化东西最多)
             5.1 调用实现Aware接口的方法:
    • 调用 BeanNameAware 的 setBeanName 方法
    • 调用 BeanClassLoaderAware 的 setBeanClassLoader
    • 调用 BeanFactoryAware 的 setBeanFactory 方法
            5.2 执行 BeanPostProcessor 的预初始化方法
    • 调用 EnvironmentAware 的 setEnvironment 方法
    • 调用 EmbeddedValueResolverAware 的 setEmbeddedValueResolver 方法
    • 调用 ResourceLoaderAware 的 setResourceLoader 方法
    • 调用 ApplicationEventPublisherAware 的 setApplicationEventPublisher 方法
    • 调用 MessageSourceAware 的 setMessageSource 方法
    • 调用 ApplicationContextAware 的 setApplicationContext 方法
    • 调用 BeanPostProcessor 的预初始化方法
           5.3 调用普通初始化方法  
    • 调用 afterPropertiesSet 方法
    • 调用 用户定义的初始化方法,即init-method 属性配置的方法
    注意:上面初始化方法从上至少是按照顺序执行的
  • 相关阅读:
    “介绍一下自己吧”——记2020BUAA软工团队介绍和采访
    [no code][scrum meeting] Alpha 7
    [no code][scrum meeting] Alpha 6
    [no code][scrum meeting] Alpha 5
    [no code][scrum meeting] Alpha 4
    [no code][scrum meeting] Alpha 3
    [no code][scrum meeting] Alpha 2
    [no code][scrum meeting] Alpha 1
    [no_code]团队贡献分分配规则
    [no_code]团队任务拆解Alpha
  • 原文地址:https://www.cnblogs.com/caoxb/p/12861629.html
Copyright © 2011-2022 走看看