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 属性配置的方法
    注意:上面初始化方法从上至少是按照顺序执行的
  • 相关阅读:
    js将UTC时间转化为当地时区时间 用JS将指定时间转化成用户当地时区的时间
    elementUI里面,用tabs组件导致浏览器卡死的问题
    根据数组对象中的属性值删除对象
    js货币金额正则表达式
    vue elementui input不能输入的问题
    vue+elementui--$message提示框被dialog遮罩层挡住问题解决
    Oracle日期函数
    plsql查询报错:Dynamic Performamnce Tables not accessible
    Oracle rownum和rowid的区别
    Oracle通过序列实现主键自增长
  • 原文地址:https://www.cnblogs.com/caoxb/p/12861629.html
Copyright © 2011-2022 走看看