在Spring框架中,Bean的生命周期是指从Bean的创建、初始化、使用到销毁的整个过程。Spring容器负责管理Bean的生命周期,并提供了多种扩展点,允许开发者在Bean的不同生命周期阶段执行自定义逻辑。
Bean生命周期的核心阶段
实例化(Instantiation)
Spring容器根据配置或注解创建Bean的实例;
如果Bean是通过构造器注入依赖的,Spring会调用相应的构造器。
属性赋值(Population of Properties)
Spring容器将配置的属性值或依赖注入到Bean中;
支持通过Setter方法、字段注入或构造器注入。
初始化(Initialization)
在Bean的属性赋值完成后,Spring容器会调用初始化方法;
初始化方法可以通过以下方式定义:
实现
InitializingBean
接口的afterPropertiesSet()
方法;使用
@PostConstruct
注解;在XML配置中指定
init-method
。
使用(In Use)
Bean初始化完成后,可以被应用程序使用;
Bean通常作为单例(Singleton)存在于Spring容器中,直到容器关闭。
销毁(Destruction)
当Spring容器关闭时,会销毁Bean实例;
销毁方法可以通过以下方式定义:
实现
DisposableBean
接口的destroy()
方法;使用
@PreDestroy
注解;在XML配置中指定
destroy-method
。
Bean生命周期的扩展点
Spring提供了多个扩展点,允许开发者在Bean生命周期的不同阶段插入自定义逻辑。
BeanPostProcessor
BeanPostProcessor
是一个接口,允许在Bean初始化前后执行自定义逻辑;主要方法:
postProcessBeforeInitialization()
:在Bean初始化之前调用;postProcessAfterInitialization()
:在Bean初始化之后调用。
示例
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; } }
BeanFactoryPostProcessor
BeanFactoryPostProcessor
允许在BeanFactory加载Bean定义之后、Bean实例化之前修改Bean的定义;主要方法:
postProcessBeanFactory()
:在BeanFactory初始化后调用。
示例
public class CustomBeanFactoryPostProcessor implements BeanFactoryPostProcessor { @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) { System.out.println("BeanFactoryPostProcessor is running"); } }
Aware接口
Spring提供了一系列
Aware
接口,允许Bean获取Spring容器的一些基础设施对象;常见的
Aware
接口:BeanNameAware
:获取Bean的名称;BeanFactoryAware
:获取BeanFactory;ApplicationContextAware
:获取ApplicationContext。
示例
public class CustomBean implements BeanNameAware { private String beanName; @Override public void setBeanName(String name) { this.beanName = name; System.out.println("Bean name is: " + beanName); } }
Bean生命周期的完整流程
实例化:Spring容器创建Bean实例;
属性赋值:Spring容器注入Bean的属性和依赖;
BeanNameAware:如果Bean实现了
BeanNameAware
,调用setBeanName()
方法;BeanFactoryAware:如果Bean实现了
BeanFactoryAware
,调用setBeanFactory()
方法;ApplicationContextAware:如果Bean实现了
ApplicationContextAware
,调用setApplicationContext()
方法;BeanPostProcessor的前置处理:调用
BeanPostProcessor
的postProcessBeforeInitialization()
方法;初始化:
如果Bean实现了
InitializingBean
,调用afterPropertiesSet()
方法;如果Bean配置了
init-method
,调用指定的初始化方法;如果Bean使用了
@PostConstruct
注解,调用标注的方法。
BeanPostProcessor的后置处理:调用
BeanPostProcessor
的postProcessAfterInitialization()
方法;使用:Bean初始化完成,可以被应用程序使用;
销毁:
如果Bean实现了
DisposableBean
,调用destroy()
方法;如果Bean配置了
destroy-method
,调用指定的销毁方法;如果Bean使用了
@PreDestroy
注解,调用标注的方法。