• Bean的生命周期


    一、IoC和Bean

    IoC就是控制反转,通俗的说就是我们不用自己创建实例对象,这些都交给Spring的Bean工厂帮助我们创建管理。Bean是IoC容器实例化,组装和管理的对象。

    二、Bean的生命周期四大阶段

    对于普通Java对象来说,他们的生命周期就是:

    • 实例化
    • 对象不再被使用时通过垃圾回收机制进行回收

    而对于Spring Bean的生命周期来说,可以分为四个阶段,当初始化完成之后,就代表这个Bean可以使用了:

    • 实例化 Instantiation
    • 属性赋值 Populate
    • 初始化 Initialization
    • 销毁 Destruction

    Bean实例化的时机也分为两种,BeanFactory管理的Bean是在使用到Bean的时候才会实例化Bean,ApplicantContext管理的Bean在容器初始化的时候就回完成Bean实例化。

    BeanFactory和ApplicantContext的区别

    BeanFactoryApplicantContext
    使用懒加载使用即时加载
    使用的语法显式提供资源对象使用创建和管理资源对象
    不支持国际化支持国际化
    不支持基于依赖的注解支持基于以来注解

    BeanFactory和ApplicantContext的优缺点分析

    BeanFactory的优缺点:

    • 优点:应用启动的时候启动资源很少,对资源要求较高的应用比较有优势;
    • 缺点:运行速度会相对来说慢一些。而且有可能会出现空指针异常的错误,而且通过Bean工厂创建的Bean生命周期会简单一些。

    ApplicantContext的优缺点:

    • 优点 :所有的Bean在启动的时候都进行了加载,系统运行的速度快;在系统启动的时候,可以发现系统中的配置问题。
    • 缺点:把费时间的操作放在系统启动中完成,所有的对象都可以预加载,缺点就是内存占用较大

    简单来说BeanFactory就像相对不那么健全的原始一些的社会,而ApplicantContext是发达健全的现代社会。

    Bean的详细生命周期

    在这里插入图片描述

    创建过程:

    • 实例化对象,以及设置Bean属性;
    • 如果通过Aware接口声明了依赖关系,则会注入Bean对容器基础设施层面的依赖,Aware接口是为了感知到自身属性。容器管理的Bean一般不需要知到容器的状态和直接使用容器。但是在某些情况下是需要在Bean中对IoC容器进行操作的。SpringIoC容器也提供了该功能,它是特定的Aware接口来完成。
    • 接下来调用BeanPostProcess的前置初始化方法postProcessBeforeInitialization,主要作用于Spring实例化完成之后,初始化之前,对Spring容器实例化Bean添加自定义处理逻辑。有点类似于AOP。
    • 如果实现了BeanFactoryPostProcess的前置初始化的afterPropertesSet方法,做一些属性被设定的自定义的事情;
    • 调用Bean自身定义的init方法,去做一些初始化相关工作;
    • 调用BeanPostProcess的后置初始化方法,postProcessAfterInitialization去做一些bean初始化之后的自定义工作。
    • 完成以上创建之后就可以使用Bean了。

    销毁过程:

    • 若实现了DisposableBean接口,则会调用destroy方法;
    • 若配置了destroy-method属性,则会调用其配置的销毁方法;,

    总结

    主要存在的是创建过程和销毁过程两个大方面:
    创建过程: 首先实例化Bean,并设置Bean的属性,根据其实现的Aware接口设置依赖信息,接下来调用BeanPostProcess的postProcessAfterInitialization方法,完成initial前的自定义逻辑;afterPropertiesSet方法做一些属性被设定后的自定义的事情;调用Bean自身定义的init方法,去做一些初始化相关的工作;然后再调用postProcessAfterInitialization去做一些bean初始化的自定义工作,这四个方法调用类似于AOP。
    此时,Bean初始化完成,可以使用这个Bean了。
    销毁过程: 如果实现了DisposableBean的destroy方法,则调用它,如果实现了自定义的销毁方法,则调用之。

  • 相关阅读:
    数据结构——克鲁斯卡尔(Kruskal)算法
    MindSpore基础教程:使用 MindCV和 Gradio 创建一个图像分类应用
    ant的javac任务的相关属性配置
    NeuralRecon拜读:单目视频实时连贯三维重建
    从零开始学数据结构系列之第一章《双链表》
    基于JavaSwing开发模拟十字路口的红绿灯变化及车辆移动+作业要求 课程设计
    第10章 组织文件
    小程序云开发笔记二
    Vue基础学习概念
    西农大 C plus
  • 原文地址:https://blog.csdn.net/m0_51529857/article/details/126193711