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

IOC容器和Bean的生命周期

一、IOC容器的初始化过程

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

先放一张整体的流程图

image-20210515095813317

关于上图的说明:

  • BeanDefinition

    <!--假设有如下的bean信息-->
    <context:property-placeholder location="dbconfig.properties"/>
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
        <property name="driverClassName" value="${jdbc.driverclass}"/>
        <property name="url" value="${jdbc.url}"/>
    </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生命周期的不同阶段处理不同的工作,比如可以在实例化、填充属性等操作完成之后自动打印一句话)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Nice2cu_Code

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值