Spring框架的生命周期主要围绕Bean的管理展开,涉及Bean的创建、初始化、使用和销毁。以下是Spring Bean的详细生命周期:
-
Bean定义:
- 在配置文件(如XML或Java配置类)中定义Bean,包括其依赖关系和初始化方法等。
-
容器启动:
- Spring容器启动(如
ApplicationContext),读取配置文件或注解,解析并注册所有Bean定义。
- Spring容器启动(如
-
实例化Bean:
- 容器根据Bean定义实例化Bean对象。
-
设置Bean属性:
- 容器注入Bean的属性和依赖(通过setter方法或构造器注入)。
-
BeanNameAware接口的回调:
- 如果Bean实现了
BeanNameAware接口,Spring会调用setBeanName方法,传递Bean的名字。
- 如果Bean实现了
-
BeanFactoryAware接口的回调:
- 如果Bean实现了
BeanFactoryAware接口,Spring会调用setBeanFactory方法,传递BeanFactory实例。
- 如果Bean实现了
-
ApplicationContextAware接口的回调:
- 如果Bean实现了
ApplicationContextAware接口,Spring会调用setApplicationContext方法,传递ApplicationContext实例。
- 如果Bean实现了
-
BeanPostProcessor的前置处理:
- Spring在Bean初始化之前,调用所有注册的
BeanPostProcessor的postProcessBeforeInitialization方法。
- Spring在Bean初始化之前,调用所有注册的
-
InitializingBean接口的回调:
- 如果Bean实现了
InitializingBean接口,Spring会调用afterPropertiesSet方法。 - 或者,通过配置初始化方法(如
<bean init-method="init"/>),调用指定的初始化方法。
- 如果Bean实现了
-
BeanPostProcessor的后置处理:
- Spring在Bean初始化之后,调用所有注册的
BeanPostProcessor的postProcessAfterInitialization方法。
- Spring在Bean初始化之后,调用所有注册的
-
Bean准备就绪:
- 此时,Bean已经完全初始化并准备好被应用程序使用。
-
Bean的使用:
- 应用程序开始使用容器中的Bean。
-
容器关闭:
- 当应用程序关闭时,Spring容器开始销毁过程。
-
DisposableBean接口的回调:
- 如果Bean实现了
DisposableBean接口,Spring会调用destroy方法。 - 或者,通过配置销毁方法(如
<bean destroy-method="cleanup"/>),调用指定的销毁方法。
- 如果Bean实现了
图示概述
+-------------------------+
| Bean Definition |
+-------------------------+
|
+-------------------------+
| Container Startup |
+-------------------------+
|
+-------------------------+
| Bean Instantiation |
+-------------------------+
|
+-------------------------+
| Set Bean Properties |
+-------------------------+
|
+-------------------------------+
| BeanNameAware#setBeanName |
+-------------------------------+
|
+--------------------------------+
| BeanFactoryAware#setBeanFactory|
+--------------------------------+
|
+------------------------------------+
| ApplicationContextAware#setApplicationContext |
+------------------------------------+
|
+-------------------------------+
| BeanPostProcessor#beforeInit |
+-------------------------------+
|
+----------------------------+
| InitializingBean#afterPropertiesSet |
| OR |
| Custom init-method |
+----------------------------+
|
+-------------------------------+
| BeanPostProcessor#afterInit |
+-------------------------------+
|
+-------------------+
| Bean Ready |
+-------------------+
|
+-------------------+
| Bean in Use |
+-------------------+
|
+-------------------+
| Container Shutdown|
+-------------------+
|
+----------------------------+
| DisposableBean#destroy |
| OR |
| Custom destroy-method |
+----------------------------+
示例代码
以下是一个示例代码,演示Spring Bean的生命周期:
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyBean implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, InitializingBean, DisposableBean {
private String property;
public void setProperty(String property) {
this.property = property;
}
@Override
public void setBeanName(String name) {
System.out.println("BeanNameAware: setBeanName called with " + name);
}
@Override
public void setBeanFactory(BeanFactory beanFactory) {
System.out.println("BeanFactoryAware: setBeanFactory called");
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) {
System.out.println("ApplicationContextAware: setApplicationContext called");
}
@Override
public void afterPropertiesSet() {
System.out.println("InitializingBean: afterPropertiesSet called");
}
public void customInit() {
System.out.println("Custom init-method: customInit called");
}
@Override
public void destroy() {
System.out.println("DisposableBean: destroy called");
}
public void customDestroy() {
System.out.println("Custom destroy-method: customDestroy called");
}
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
MyBean myBean = (MyBean) context.getBean("myBean");
((ClassPathXmlApplicationContext) context).close();
}
}
beans.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="myBean" class="com.example.MyBean" init-method="customInit" destroy-method="customDestroy">
<property name="property" value="someValue"/>
</bean>
</beans>
通过这个示例代码,可以看到Spring Bean的完整生命周期,包括属性设置、初始化和销毁。