Spring Bean 的生命周期可以分为以下几个阶段:
-
实例化:在容器中创建一个 Bean 的实例。
-
属性赋值:向 Bean 实例中注入属性值或依赖对象。
-
初始化前处理(post-processor):调用 Bean 实现了相应接口的回调方法,例如 BeanNameAware、BeanFactoryAware、ApplicationContextAware 等方法。
-
初始化:调用 Bean 的初始化方法,例如 InitializingBean 接口的方法、自定义的 init-method 方法等。
-
初始化后处理(post-processor):调用 Bean 实现了相应接口的回调方法,例如 BeanPostProcessor 的 postProcessBeforeInitialization 和 postProcessAfterInitialization 方法。
-
使用:Bean 可以被容器和其他对象引用,此时 Bean 处于可用状态。
-
销毁前处理(post-processor):调用 Bean 实现了相应接口的回调方法,例如 DestructionAwareBeanPostProcessor 的 postProcessBeforeDestruction 方法。
-
销毁:调用 Bean 的销毁方法,例如 DisposableBean 接口的方法、自定义的 destroy-method 方法等。
以下是一个简单的 Spring Bean 生命周期的演示:
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
public class MyBean implements InitializingBean, DisposableBean {
private String name;
public void setName(String name) {
this.name = name;
}
public void init() {
System.out.println("MyBean init method called");
}
@Override
public void destroy() throws Exception {
System.out.println("MyBean destroy method called");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("MyBean afterPropertiesSet method called");
}
}
在上面的代码中,我们定义了一个名为 MyBean 的类。它实现了 InitializingBean 和 DisposableBean 接口,并定义了一个名为 init 的方法和一个名为 name 的属性。
在 MyBean 的初始化过程中,Spring 会按照以下顺序调用各个回调方法:
-
实例化 MyBean 对象。
-
将配置文件中的属性值或引用注入到 MyBean 对象中。
-
调用 MyBean 实现的 InitializingBean 接口中的 afterPropertiesSet 方法。
-
调用 MyBean 实现的 init 方法。
在 MyBean 的销毁过程中,Spring 会按照以下顺序调用回调方法:
-
调用 MyBean 实现的 DisposableBean 接口中的 destroy 方法。
-
调用 MyBean 自定义的销毁方法。
下面是一个 Spring 配置文件的示例,用于配置 MyBean 的生命周期:
<bean id="myBean" class="com.example.demo.MyBean" init-method="init" destroy-method="customDestroy">
<property name="name" value="Test"/>
</bean>
在配置文件中,我们将 MyBean 的类名、init 方法和 customDestroy 方法分别指定给 id、init-method 和 destroy-method 属性。同时,我们也将 name 属性的值设置为 "Test"。
以上演示代码仅为简单示例,实际应用中可能会有更多的回调方法和复杂的配置。