Spring中IOC容器和Bean的生命周期

傷城~ 2022-10-16 07:52 284阅读 0赞

IOC容器和Bean的生命周期

文章目录

  • IOC容器和Bean的生命周期
    • 一、IOC容器的初始化过程
    • 二、Bean的生命周期

一、IOC容器的初始化过程

IOC容器是一个Map(可以通过 getBean() 获取到对应key的value,value存放的是对象)

先放一张整体的流程图

image-20210515095813317

关于上图的说明:

  • BeanDefinition

    1. <!--假设有如下的bean信息-->
    2. <context:property-placeholder location="dbconfig.properties"/>
    3. <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
    4. <property name="username" value="${jdbc.username}"/>
    5. <property name="password" value="${jdbc.password}"/>
    6. <property name="driverClassName" value="${jdbc.driverclass}"/>
    7. <property name="url" value="${jdbc.url}"/>
    8. </bean>

    BeanDefinition的bean信息中属性的值是占位符形式(${xxx}),并没有赋予真正的值

  • 两种后置处理器

    • BeanFactoryPostProcessor

      • 扩展增强的是 BeanFactory

      image-20210515111049663

      BeanFactoryPostProcessor 还完成了 @Bean、@Component 等注解的解析

    • BeanPostProcessor

      • 扩展增强的是 bean 对象
  • BeanFactory

    是IOC容器的入口

  • IOC容器的初始化过程

    • bean的定义信息 → BeanDefinitionReader 读取bean信息 → BeanDefinitionBeanFactoryPostProcessorBeanFactory

二、Bean的生命周期

BeanFactory中调用反射代码实例化bean,在堆中开辟一块空间,此时属性都是默认值,接下来开始初始化。

Bean生命周期图及文字描述:

image-20210515112206085

  1. Spring启动,查找并加载需要被Spring管理的Bean,进行Bean的实例化(如果有多个bean,则需要循环遍历进行初始化)
  2. Bean实例化后调用set()方法对Bean的属性进行赋值
  3. 如果Bean实现了BeanNameAware接口的话,Spring将Bean的Id传递给setBeanName()方法

    • 当需要在普通对象中获取容器相关的内部对象时,就需要实现 *Aware 接口
  4. 如果Bean实现了BeanFactoryAware接口的话,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入
  5. 如果Bean实现了ApplicationContextAware接口的话,Spring将调用Bean的setApplicationContext()方法,将bean所在应用的上下文引用传入进来

    image-20210515112701530 image-20210515112720362

  6. 与上述类似,如果实现了其余Aware接口,就要调用对应的方法,具体顺序如下图所示:

    image-20210515113328020

  7. 如果Bean实现了BeanPostProcessor接口,Spring就将调用他们的postProcessBeforeInitialization()方法
  8. 如果Bean 实现了InitializingBean接口,Spring将调用他们的afterPropertiesSet()方法
  9. 如果Bean在配置文件中定义了 init-method 属性,执行指定的方法
  10. 如果Bean实现了BeanPostProcessor接口,Spring就将调用他们的postProcessAfterInitialization()方法
  11. 此时,Bean已经准备就绪,可以被应用程序使用了,他们将一直驻留在应用上下文中,直到应用上下文被销毁
  12. 销毁过程:如果Bean实现了DisposableBean接口,Spring将调用它的destory()接口方法
  13. 如果Bean在配置文件中定义了 destory-method 属性,执行指定的方法

注意:

在实例化操作之前,会进行准备BeanPostProcessor、监听器、广播器等工作(监听器、广播器利用了观察者模式,可以在Bean生命周期的不同阶段处理不同的工作,比如可以在实例化、填充属性等操作完成之后自动打印一句话)

发表评论

表情:
评论列表 (有 0 条评论,284人围观)

还没有评论,来说两句吧...

相关阅读