一、生命周期大致概念
即当我们实际使用一个对象时,它是何时被创建出来,何时被赋予基础属性,何时可以被我们调整,何时被实际投入spring 容器中进入可使用状态,又在何时被销毁释放不再使用。
类似一个人的一生或一个物件的产出和使用到废弃。
二、五个大阶段
在Spring框架中,Bean的生命周期管理是其核心功能之一。理解Bean的生命周期对于开发高效且易于维护的应用程序至关重要。Spring容器负责创建、初始化、装配以及销毁Bean。
-
实例化:Spring容器根据配置信息(如XML配置文件或注解)找到定义好的Bean,并使用构造器或工厂方法创建Bean的实例。
类的构造方法执行,一般为无参构造。 -
属性填充:如果通过setter方法或者字段注入来设置依赖关系,则在这个阶段完成属性值/依赖项的设置。
-
初始化:
根据配置指定的init-method
属性,执行自定义的初始化方法(init 方法的执行)。 -
使用:此时,Bean已经准备就绪,可以被应用程序正常使用了。
-
销毁:当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容器当中取出BeanStudent studentBean = factory.getBean("studentBean", Student.class);System.out.println(studentBean);
参考:
AI 以及
【Spring6】| Bean的生命周期(五步、七步、十步法剖析)