Bean的生命周期
大约 4 分钟
Bean生命周期概述
Bean的生命周期:即Bean在Spring容器内,被Spring管理的各个环节。
Spring管理着bean,负责bean的创建、销毁等,bean在Spring内的从创建到销毁的整个过程,即bean的生命周期。
一个Bean的生命周期包括多个环节,不同的环节会执行不同的方法,了解bean的生命周期,有助于在合适的时间节点执行特定的代码,从而精细化对bean的使用。
Bean⽣命周期的管理,可以参考Spring的源码:AbstractAutowireCapableBeanFactory 类的 doCreateBean()⽅法。
Bean的5步生命周期
5步生命周期是bean的基本生命周期,包括:
- Bean的实例化:构造方法或工厂(底层早晚也是new)
- Bean的属性赋值:set方法注入
- Bean的初始化:调用指定的初始化方法
- Bean的使用
- Bean的销毁:调用指定的销毁方法。

<!--
init-method属性指定初始化⽅法。
destroy-method属性指定销毁⽅法。
初始化方法、销毁方法建议无参数。如需要提供属性并注入即可。
-->
<bean id="userBean" class="com.powernode.spring6.bean.User"
init-method="initBean" destroy-method="destroyBean">
<property name="name" value="zhangsan"/>
</bean>bean的销毁会在Spring IoC容器关闭时执行:
ClassPathXmlApplicationContext context = (ClassPathXmlApplicationContext) applicationContext;
// ClassPathXmlApplicationContext类才有 close 方法,用以手动关闭容器
context.close();- JVM中内存回收前会调用 finalize() 方法,不是 destroy。
Bean的7步生命周期
7步生命周期是5步生命周期的拓展,包括:
- Bean的实例化:构造方法或工厂(底层早晚也是new)
- Bean的属性赋值:set方法注入
- 执行Bean后处理器的before方法:即将开始初始化
- Bean的初始化:调用指定的初始化方法
- 执行Bean后处理器的after方法:已完成初始化
- Bean的使用
- Bean的销毁:调用指定的销毁方法。

Bean后处理器:实现BeanPostProcessor 接口的类。
public class LogBeanPostProcessor implements BeanPostProcessor {
// before方法:bean已完成实例化和属性赋值
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
System.out.println("Bean后处理器的before⽅法执⾏,即将开始初始化");
return bean;
}
// after方法:bean已完成实例化和属性赋值、初始化
@Override
public Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException {
System.out.println("Bean后处理器的after⽅法执⾏,已完成初始化");
return bean;
}
}在Spring配置文件中配置Bean后处理器:
<!--配置Bean后处理器。这个后处理器将作⽤于当前配置⽂件中所有的bean。-->
<bean class="com.powernode.spring6.bean.LogBeanPostProcessor"/>
<!--
init-method属性指定初始化⽅法。
destroy-method属性指定销毁⽅法。
-->
<bean id="userBean" class="com.powernode.spring6.bean.User"
init-method="initBean" destroy-method="destroyBean">
<property name="name" value="zhangsan"/>
</bean>- 在配置文件中配置的Bean后处理器作用于当前配置文件的所有bean。
Bean的10步生命周期
10步生命周期是对7步生命周期的进一步拓展,基于接口实现的检查,智能判断是否需要拓展的3步生命周期。

Aware相关接口包括:BeanNameAware、BeanClassLoaderAware、BeanFactoryAware。
- 当Bean实现了BeanNameAware,Spring会将Bean的名字传递给Bean。
- 当Bean实现了BeanClassLoaderAware,Spring会将加载该Bean的类加载器传递给Bean。
- 当Bean实现了BeanFactoryAware,Spring会将Bean**⼯⼚对象**传递给Bean。
- Aware接口用于接收特定的参数,如需要可以实现相关的接口。
10步生命周期下,至多有5个接口:
- 3个Aware接口:接收Bean有关的参数
- InitializingBean接口:额外执行 afterPropertiesSet() 方法。(早于初始化)
- DisposableBean接口:额外执行 destroy() throws Exception 方法。(早于销毁)
初始化、销毁的方法仍由 <bean> 的有关属性决定。
Bean的作用域与生命周期管理
Spring 根据Bean的作⽤域来选择管理⽅式:
对于 singleton 作⽤域的 Bean,Spring 能够精确地知道该Bean何时被创建,何时初始化完成,以及何时被销毁。.
- Spring负责完整的生命周期
对于 prototype 作⽤域的 Bean,Spring 只负责创建,当容器创建了 Bean 的实例后,Bean 的实例就交给客户端代码管理,Spring 容器将不再跟踪其⽣命周期。
- Spring负责交付前(使用Bean之前)的生命周期
手动将对象交由Spring管理
// 创建 默认可列表BeanFactory 对象
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
// 注册Bean,userBean是bean的id
factory.registerSingleton("userBean", user);
// 从spring容器中获取bean
User userBean = factory.getBean("userBean", User.class);- 手动交给Spring管理仅仅简单地纳入容器,并不会负责生命周期相关方法的调用。?
