Spring生命周期都有哪些阶段
Spring Bean 的生命周期:
创建(实例化)—初始化(初始化前,初始化,初始化后)—就绪并可用—销毁(销毁前,销毁,销毁后)
以下为你详细介绍这些阶段及其作用。
1. 实例化(Instantiation)
- 描述:这是 Spring Bean 生命周期的起始点,Spring 容器根据 Bean 的定义信息,利用反射机制调用 Bean 类的构造函数来创建 Bean 的实例。此阶段只是在内存中分配了对象的空间,还未对其属性进行赋值。
- 示例:
// 定义一个简单的 Bean 类
public class MyBean {
public MyBean() {
System.out.println("MyBean 实例化");
}
}
2. 属性赋值(Populate Properties)
- 描述:在 Bean 实例创建完成后,Spring 容器会根据 Bean 的定义信息,将依赖的其他 Bean 或属性值注入到该 Bean 中。可以通过构造函数注入、Setter 方法注入或字段注入等方式实现。
- 示例(Setter 方法注入):
public class MyBean {
private AnotherBean anotherBean;
public void setAnotherBean(AnotherBean anotherBean) {
this.anotherBean = anotherBean;
System.out.println("MyBean 属性赋值");
}
}
3. 初始化前(Initialization - Before)
- 描述:此阶段会调用
BeanPostProcessor
的postProcessBeforeInitialization
方法。BeanPostProcessor
是 Spring 提供的一个扩展点,允许开发者在 Bean 初始化前后进行自定义处理。可以在这个方法中对 Bean 进行额外的处理,如修改 Bean 的属性等。 - 示例:
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("MyBean 初始化前处理,Bean 名称: " + beanName);
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
}
4. 初始化(Initialization)
4.1 实现 InitializingBean
接口
- 描述:如果 Bean 实现了
InitializingBean
接口,Spring 容器会调用其afterPropertiesSet
方法。该方法通常用于在 Bean 的属性注入完成后进行一些初始化操作。 - 示例:
import org.springframework.beans.factory.InitializingBean;
public class MyBean implements InitializingBean {
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("MyBean 实现 InitializingBean 接口的初始化方法调用");
}
}
4.2 自定义初始化方法
- 描述:可以通过在 Bean 定义中指定自定义的初始化方法,Spring 容器会在 Bean 的属性注入完成后调用该方法。
- 示例(Java 配置):
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AppConfig {
@Bean(initMethod = "customInit")
public MyBean myBean() {
return new MyBean();
}
}
public class MyBean {
public void customInit() {
System.out.println("MyBean 自定义初始化方法调用");
}
}
5. 初始化后(Initialization - After)
- 描述:此阶段会调用
BeanPostProcessor
的postProcessAfterInitialization
方法。同样是利用BeanPostProcessor
这个扩展点,开发者可以在 Bean 初始化完成后进行自定义处理,如对 Bean 进行代理包装等。 - 示例:参考初始化前阶段的
MyBeanPostProcessor
类。
6. 就绪并可使用(Ready to Use)
- 描述:经过上述步骤后,Bean 已经完成了初始化过程,处于就绪状态,可以被应用程序使用。此时,应用程序可以通过 Spring 容器获取该 Bean 并调用其方法。
7. 销毁前(Destruction - Before)
- 描述:当 Spring 容器关闭时,在销毁 Bean 之前,如果有相关的销毁前处理器,会执行相应的操作。不过这不是 Spring 标准生命周期中默认的阶段,可能需要开发者自定义实现。
8. 销毁(Destruction)
8.1 实现 DisposableBean
接口
- 描述:如果 Bean 实现了
DisposableBean
接口,Spring 容器会调用其destroy
方法。该方法通常用于在 Bean 销毁前进行一些资源释放操作,如关闭数据库连接、释放文件句柄等。 - 示例:
import org.springframework.beans.factory.DisposableBean;
public class MyBean implements DisposableBean {
@Override
public void destroy() throws Exception {
System.out.println("MyBean 实现 DisposableBean 接口的销毁方法调用");
}
}
8.2 自定义销毁方法
- 描述:可以通过在 Bean 定义中指定自定义的销毁方法,Spring 容器会在关闭时调用该方法。
- 示例(Java 配置):
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AppConfig {
@Bean(destroyMethod = "customDestroy")
public MyBean myBean() {
return new MyBean();
}
}
public class MyBean {
public void customDestroy() {
System.out.println("MyBean 自定义销毁方法调用");
}
}
9. 销毁后(Destruction - After)
- 描述:Bean 经过销毁操作后,实例被销毁,其所占用的资源被释放,不再可用。
综上所述,Spring Bean 的生命周期涵盖了从创建到销毁的多个阶段,开发者可以通过实现特定的接口或指定自定义方法来控制 Bean 的初始化和销毁过程,以满足不同的业务需求。