Spring Bean 的生命周期是指从 Bean 的创建、初始化、使用到销毁的整个过程。Spring 容器负责管理 Bean 的生命周期,并提供了多个扩展点,允许开发者在 Bean 的不同阶段执行自定义逻辑。
以下是 Spring Bean 的完整生命周期:
1. Bean 的生命周期阶段
Spring Bean 的生命周期可以分为以下几个阶段:
(1)实例化(Instantiation)
- Spring 容器根据配置(如 XML、注解或 Java 配置)创建 Bean 的实例。
- 如果 Bean 是单例的,Spring 会在容器启动时创建实例;如果是原型的,则每次请求时创建实例。
(2)属性赋值(Populate Properties)
- Spring 容器将配置的属性值或依赖注入到 Bean 中。
- 支持通过 Setter 方法、构造函数或字段注入。
(3)BeanNameAware 和 BeanFactoryAware
- 如果 Bean 实现了
BeanNameAware
接口,Spring 会调用setBeanName()
方法,将 Bean 的名称传递给它。 - 如果 Bean 实现了
BeanFactoryAware
接口,Spring 会调用setBeanFactory()
方法,将 BeanFactory 实例传递给它。
(4)BeanPostProcessor 的前置处理
- 如果容器中注册了
BeanPostProcessor
,Spring 会调用其postProcessBeforeInitialization()
方法,在 Bean 初始化之前执行自定义逻辑。
(5)初始化(Initialization)
- 如果 Bean 实现了
InitializingBean
接口,Spring 会调用afterPropertiesSet()
方法。 - 如果 Bean 配置了自定义的初始化方法(如
init-method
),Spring 会调用该方法。
(6)BeanPostProcessor 的后置处理
- 如果容器中注册了
BeanPostProcessor
,Spring 会调用其postProcessAfterInitialization()
方法,在 Bean 初始化之后执行自定义逻辑。
(7)使用(In Use)
- Bean 已经初始化完成,可以被应用程序使用。
(8)销毁(Destruction)
- 如果 Bean 实现了
DisposableBean
接口,Spring 会调用destroy()
方法。 - 如果 Bean 配置了自定义的销毁方法(如
destroy-method
),Spring 会调用该方法。
2. Bean 生命周期的流程图
以下是 Spring Bean 生命周期的流程图:
实例化 Bean
|
v
属性赋值(依赖注入)
|
v
BeanNameAware 和 BeanFactoryAware
|
v
BeanPostProcessor 的前置处理
|
v
初始化(InitializingBean 和 init-method)
|
v
BeanPostProcessor 的后置处理
|
v
Bean 已就绪,可以被使用
|
v
销毁(DisposableBean 和 destroy-method)
3. 扩展点详解
Spring 提供了多个扩展点,允许开发者在 Bean 生命周期的不同阶段执行自定义逻辑:
(1)BeanPostProcessor
- 用于在 Bean 初始化前后执行自定义逻辑。
- 实现
postProcessBeforeInitialization()
和postProcessAfterInitialization()
方法。
public class CustomBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) {
System.out.println("Before Initialization: " + beanName);
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) {
System.out.println("After Initialization: " + beanName);
return bean;
}
}
(2)InitializingBean 和 DisposableBean
InitializingBean
接口用于在 Bean 初始化时执行逻辑。DisposableBean
接口用于在 Bean 销毁时执行逻辑。
public class CustomBean implements InitializingBean, DisposableBean {
@Override
public void afterPropertiesSet() {
System.out.println("Bean is initialized");
}
@Override
public void destroy() {
System.out.println("Bean is destroyed");
}
}
(3)自定义初始化方法和销毁方法
- 可以通过
@Bean(initMethod = "init", destroyMethod = "cleanup")
或 XML 配置指定自定义的初始化和销毁方法。
public class CustomBean {
public void init() {
System.out.println("Custom init method");
}
public void cleanup() {
System.out.println("Custom destroy method");
}
}
4. Bean 生命周期示例
以下是一个完整的 Bean 生命周期示例:
public class MyBean implements BeanNameAware, BeanFactoryAware, InitializingBean, DisposableBean {
private String name;
public void setName(String name) {
this.name = name;
}
@Override
public void setBeanName(String name) {
System.out.println("BeanNameAware: " + name);
}
@Override
public void setBeanFactory(BeanFactory beanFactory) {
System.out.println("BeanFactoryAware");
}
@Override
public void afterPropertiesSet() {
System.out.println("InitializingBean: afterPropertiesSet");
}
public void customInit() {
System.out.println("Custom init method");
}
@Override
public void destroy() {
System.out.println("DisposableBean: destroy");
}
public void customDestroy() {
System.out.println("Custom destroy method");
}
}
配置:
<bean id="myBean" class="com.example.MyBean" init-method="customInit" destroy-method="customDestroy">
<property name="name" value="John" />
</bean>
总结
Spring Bean 的生命周期包括实例化、属性赋值、初始化、使用和销毁等阶段。Spring 提供了多个扩展点(如 BeanPostProcessor
、InitializingBean
、DisposableBean
等),允许开发者在 Bean 生命周期的不同阶段执行自定义逻辑。理解 Bean 的生命周期有助于更好地掌握 Spring 的工作原理,并在实际开发中灵活运用。
THE END
暂无评论内容