整体流程
- 实例化 Bean
- Bean 的生命周期从实例化开始。Spring 容器使用 Bean 的构造器或相应的工厂方法创建 Bean 实例。
- 属性赋值
- 在 Bean 实例化之后,Spring 容器将按照在配置文件中定义的属性值注入 Bean。
- BeanNameAware、BeanFactoryAware
- 如果 Bean 实现了 BeanNameAware 或 BeanFactoryAware 接口,Spring 容器将调用它们的 setBeanName 或 setBeanFactory 方法。
- BeanPostProcessor 前处理
- 在初始化方法调用之前,Spring 容器会调用 BeanPostProcessor 接口的 postProcessBeforeInitialization 方法。
- 初始化方法
- 如果 Bean 实现了 InitializingBean 接口,Spring 容器将调用其 afterPropertiesSet 方法。此外,如果 Bean 定义了 init-method,该方法也将被调用。
- BeanPostProcessor 后处理
- 在初始化方法调用之后,Spring 容器会调用 BeanPostProcessor 接口的 postProcessAfterInitialization 方法。
- DisposableBean
- 当容器关闭时,如果 Bean 实现了 DisposableBean 接口,将调用其 destroy 方法。此外,如果 Bean 定义了 destroy-method,该方法也将被调用。
- 销毁
- Bean 的生命周期结束时,将进行资源清理工作。
代码实例
MyBean.java
import org.springframework.beans.factory.*;
public class MyBean implements InitializingBean, DisposableBean, BeanFactoryAware, BeanNameAware {
private String name;
public MyBean() {
System.out.println("1. 实例化 Bean");
}
public void setBeanFactory(BeanFactory beanFactory) {
System.out.println("2. BeanFactoryAware");
}
public void setBeanName(String beanName) {
System.out.println("3. BeanNameAware");
}
public void setName(String name) {
this.name = name;
System.out.println("4. 属性赋值");
}
public void afterPropertiesSet() {
System.out.println("5. InitializingBean 接口初始化方法");
}
public void customInit() {
System.out.println("6. 自定义初始化方法");
}
public void destroy() {
System.out.println("7. DisposableBean 接口销毁方法");
}
public void customDestroy() {
System.out.println("8. 自定义销毁方法");
}
}
MyBeanPostProcessor.java
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("9. BeanPostProcessor");
// 实现逻辑
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("10. BeanPostProcessor");
// 实现逻辑
return bean;
}
}
BeanLifeCycleDemo.java
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class BeanLifeCycleDemo {
public static void main(String[] args) {
ConfigurableApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
context.close();
}
}
applicationContext.xml
放在resources下
<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 class="com.example.demo.springboot.MyBean" init-method="customInit" destroy-method="customDestroy" id="myBean">
<property name="name" value="myName" />
</bean>
<bean class="com.example.demo.springboot.MyBeanPostProcessor" ></bean>
</beans>
执行结果
17:17:37.787 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'com.example.demo.springboot.MyBeanPostProcessor#0'
17:17:37.808 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'myBean'
1. 实例化 Bean
4. 属性赋值
3. BeanNameAware
2. BeanFactoryAware
9. BeanPostProcessor
5. InitializingBean 接口初始化方法
6. 自定义初始化方法
10. BeanPostProcessor
17:17:37.878 [main] DEBUG org.springframework.context.support.ClassPathXmlApplicationContext - Closing org.springframework.context.support.ClassPathXmlApplicationContext@6574b225, started on Thu Sep 26 17:17:37 CST 2024
7. DisposableBean 接口销毁方法
8. 自定义销毁方法