文章目录
Spring Bean的生命周期
一、为什么知道 Bean 的生命周期?
生命周期的本质:在哪个时间节点上调用了哪个类的哪个方法?我们需要充分的了解在这个生命线上,都有哪些特殊的时间节点!只有我们知道了这些特殊的时间节点都在哪,到时候我们才可以确定代码写到哪。我们可能需要在某个特殊的时间节点上执行一段特定的代码,这段代码就可以放到这个节点上;当生命线走到这里的时候,自然会被调用。
二、生命周期大致了解
1、Spring Bean 的生命周期是指一个 Bean 在容器中从创建、初始化、销毁的全过程。
2、容器启动 ----> 实例化 Bean ----> 依赖注入 ----> 初始化前逻辑(BeanPostProcessor
)----> 初始化(@PostConstruct/InitializingBean/init-method
)----> 初始化后逻辑(BeanPostProcessor
)----> 使用 Bean ----> 销毁(@PreDestory/DisposableBean/destroy-method
)
3、各阶段解析与方法:
阶段 | 描述 | 可插入的自定义方法/接口 |
---|---|---|
实例化 | 容器通过反射创建 Bean 实例,但未设置属性或依赖 | 调用无参构造器创建对象 |
依赖注入 | 容器将依赖注入到 Bean 的属性中 | 通过依赖注入(例如 @Autowired 、@Resource、XML 配置或 Java 配置)将属性注入到 Bean 中 |
初始化前 | Bean 实例化和依赖注入后,执行初始化前的一些逻辑 | 实现 BeanPostProcessor 接口的 postProcessBeforeInitialization 方法 |
初始化 | 执行 Bean 的初始化逻辑 | @PostConstruct 、实现 InitializingBean 、配置文件指定的 init-method 方法 |
初始化后 | 执行初始化后的一些逻辑 | 实现 BeanPostProcessor 接口的 postProcessAfterInitialization 方法 |
使用 Bean | ||
销毁 | 容器关闭或 Bean 的生命周期结束时,执行销毁逻辑 | @PreDestroy 、实现 DisposableBean 、配置文件指定的 destroy-method 方法 |
三、详细分析生命周期
3.1 ① 初步划分为 5 步:
第一步:实例化 Bean(调用无参数构造方法)
第二步:给 Bean 属性赋值(调用set方法)
第三步:初始化 Bean(会调用 Bean 的 init 方法。注意:这个 init 方法需要自己写)
第四步:使用 Bean
第五步:销毁 Bean(会调用 Bean 的 destroy 方法。注意:这个 destroy 方法需要自己写)
3.1.1 spring 框架中怎么理解
代码测试:spring.xml 版
1、定义一个 Bean:
public class User {
private String username;
public void setUsername(String username) {
System.out.println("第二步:给对象的属性赋值");
this.username = username;
}
public User() {
System.out.println("第一步:实例化Bean,无参数构造方法执行了");
}
// 初始化Bean,需要自己写,自己配,方法名随意
public void initBean() {
System.out.println("第三步:初始化Bean");
}
// 销毁Bean,需要自己写,自己配,方法名随意
public void destroyBean() {
System.out.println("第五步:销毁Bean");
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
'}';
}
}
2、spring.xml 中配置:需要在 <bean>
标签中 设置 init-method 和 destroy-method 属性,手动指定初始化方法和销毁方法!
<bean id="user" class="全类名" init-method="initBean" destroy-method="destroyBean">
<!--给属性赋值-->
<property name="username" value="张三"/>
</bean>
3、开始测试:
@Test
public void test(){
ApplicationContext applicationContext = new