当前位置: 首页 > article >正文

Spring Bean 生命周期 五步->七步->十步 扩展学习总结 bean作用域 Scope,手动注册自己new的对象

一、生命周期大致概念

即当我们实际使用一个对象时,它是何时被创建出来,何时被赋予基础属性,何时可以被我们调整,何时被实际投入spring 容器中进入可使用状态,又在何时被销毁释放不再使用。
类似一个人的一生或一个物件的产出和使用到废弃。

二、五个大阶段

在Spring框架中,Bean的生命周期管理是其核心功能之一。理解Bean的生命周期对于开发高效且易于维护的应用程序至关重要。Spring容器负责创建、初始化、装配以及销毁Bean。

  1. 实例化:Spring容器根据配置信息(如XML配置文件或注解)找到定义好的Bean,并使用构造器或工厂方法创建Bean的实例。
    类的构造方法执行,一般为无参构造。

  2. 属性填充:如果通过setter方法或者字段注入来设置依赖关系,则在这个阶段完成属性值/依赖项的设置。

  3. 初始化
    根据配置指定的init-method属性,执行自定义的初始化方法(init 方法的执行)。

  4. 使用:此时,Bean已经准备就绪,可以被应用程序正常使用了。

  5. 销毁:当ApplicationContext关闭时,若Bean实现了DisposableBean接口,则会调用destroy()方法;另外也可以通过配置文件中的destroy-method属性指定一个自定义的销毁方法来执行清理工作。

		// 原始手动获取spring.xml 文件中的类的 方式
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
        User user = applicationContext.getBean("自定义的类名", User.class);
        System.out.println("第四步:使用Bean"+user);
 
        // 手动关闭Spring容器
        ClassPathXmlApplicationContext context = (ClassPathXmlApplicationContext) applicationContext;
        context.close();

三、额外扩展阶段(扩展到七个阶段)

在上述第三阶段,初始化阶段,可以在初始化前后分别添加初始化前后的动作,由此可以扩展到七步,具体如下

一:实例化Bean
二:Bean属性填充
三:执行“Bean后处理器”的before方法 即初始化前的动作
四:初始化
五:执行“Bean后处理器”的after方法 同理,初始化后的动作
六:使用
七:销毁

实操时具体为:自定义一个类并实现接口 BeanPostProcessor 并重写方法
postProcessBeforeInitialization (简称before 方法)
postProcessAfterInitialization(简称after 方法)

两个方法均会传入两个参数,分别为
创建的 bean对象,以及当前bean的名字 (Object bean, String beanName)

当在 spring.xml 文件中配置上述的自定义类后,会作用于当前配置文件中的所有类

<bean class="xxx.xxx.xxx.xxx.自定义的类名"/>

全路径:↑

四、更多的额外扩展(扩展到十个阶段)

在上述过程出现的初始化前的before 动作,我们在其前后又增加了两个特殊阶段用于更多的不同阶段的额外处理,以及在销毁bean 前做了特殊动作,具体增加如下:

一:实例化Bean
二:Bean属性填充
三:检查是否实现了 Aware相关接口(BeanNameAware、BeanClassLoaderAware、BeanFactoryAware),有则需要调用重写方法并传递相关入参实现进一步额外操作
四:执行“Bean后处理器”的before方法 即初始化前的动作
五:检查是否实现了 InitializingBean 接口,有重写afterPropertiesSet方法则调用并传递相关参数做进一步额外处理
六:初始化
七:执行“Bean后处理器”的after方法 同理,初始化后的动作
八:使用
九:检查是否实现接口 DisposableBean ,有实现则调用重写的方法
十:销毁

Aware相关接口

包括:BeanNameAware、BeanClassLoaderAware、BeanFactoryAware

①当Bean实现了BeanNameAware,Spring会将Bean的名字传递给Bean。

②当Bean实现了BeanClassLoaderAware,Spring会将加载该Bean的类加载器传递给Bean。

③当Bean实现了BeanFactoryAware,Spring会将Bean工厂对象传递给Bean。

可额外实现的接口类

一、before方法前:
BeanNameAware
BeanClassLoaderAware
BeanFactoryAware
二、before方法后:
InitializingBean
三、销毁前
DisposableBean

InitializingBean的方法早于init-method的执行。
DisposableBean的方法早于destroy-method的执行。

五、bean作用域 Scope(作用域)

Spring 根据Bean的作用域来选择管理方式

(1)对于singleton(单例) 作用域的Bean:
Spring 能够精确地知道该Bean何时被创建,何时初始化完成,以及何时被销毁。(即上面全部步骤都会执行)

(2)而对于 prototype(多例/原型) 作用域的 Bean:
Spring 只负责创建,当容器创建了 Bean 的实例后,Bean 的实例就交给客户端代码管理,Spring 容器将不再跟踪其生命周期。
(上面十步中的 最后两步
九:检查是否实现接口 DisposableBean ,有实现则调用重写的方法
十:销毁
不再执行)

六、手动注册自己 new 的对象到Spring中

        // 自己new的对象,没有被Spring管理
        Student student = new Student();
        System.out.println(student);
        // 创建 DefaultListableBeanFactory  对象
        DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
        // 调用 registerSingleton 方法注册 Bean 参数为名字以及对象
        factory.registerSingleton("studentBean",student);
        // 从Spring容器当中取出Bean
        Student studentBean = factory.getBean("studentBean", Student.class);
        System.out.println(studentBean);

参考:
AI 以及
【Spring6】| Bean的生命周期(五步、七步、十步法剖析)


http://www.kler.cn/news/337373.html

相关文章:

  • 四川音盛佳云电子商务有限公司助力商家扬帆起航
  • 产品经理内容分享(二):AI产品经理的入门路线图
  • 网页WebRTC电话和软电话哪个好用?
  • 碰撞检测 | 图解视线生成Bresenham算法(附ROS C++/Python/Matlab实现)
  • Sharding 分页原理分析
  • 传感器模块编程实践(二)W5500 SPI转以太网模块简介及驱动源码
  • C#-泛型学习笔记
  • MQ 架构设计原理与消息中间件详解(一)(上一篇只是概述)
  • Github 2024-10-07 开源项目周报 Top15
  • YoloV9改进策略:BackBone改进|CAFormer在YoloV9中的创新应用,显著提升目标检测性能
  • Linux中的网络指令:ping、netstat、watch、pidof、xargs
  • mysql 慢查询日志、设置单条数据最大 packet 插入大小指令
  • 2024Java最新面试题总结(针对于一些小厂、中厂)
  • 通信工程学习:什么是AIOT智能物联网
  • [云] Hands-on with a sample application--DockerCoins 挖矿程序!
  • 外国钞票面值检测系统源码分享
  • 【人工智能】AI人工智能的重要组成部分,深入解析CNN与RNN两种神经网络的异同与应用场景和区别
  • kubernetes get pods的STATUS字段显示ImagePullBackOff 的解决办法
  • UE5数字人制作平台使用及3D模型生成
  • 毕业设计项目 深度学习语义分割实现弹幕防遮(源码分享)