在Spring框架中,Spring Beans的生命周期是从创建到销毁的一系列过程。这个过程包括了多个阶段,每个阶段都可以通过不同的方式来定制和干预。下面是一个典型的Spring Bean生命周期的概述:
实例化 Bean → 属性填充 → Aware接口回调 → BeanPostProcessor前置处理 → InitializingBean → 自定义初始化方法 → BeanPostProcessor后置处理 → Bean就绪 → Bean销毁
目录
4. BeanPostProcessor接口(前置、后置处理)
1. 实例化
-
创建Bean实例:当Spring容器启动时,它会根据配置创建Bean的实例。这可以通过构造器、工厂方法或实例化方法来完成。
2. 属性填充
-
设置属性值:一旦Bean实例被创建,Spring会通过依赖注入(Dependency Injection, DI)将所有配置的属性值注入到Bean中。这包括通过setter方法设置属性值或直接在构造器中注入。
3.Aware 接口回调(按顺序执行)
1. BeanNameAware接口
-
实现BeanNameAware:如果Bean实现了
BeanNameAware
接口,Spring会调用其setBeanName(String name)
方法,将Bean的ID传递给Bean实例。
public interface BeanNameAware extends Aware {
void setBeanName(String name);
}
2. BeanFactoryAware接口
-
实现BeanFactoryAware:如果Bean实现了
BeanFactoryAware
接口,Spring会调用其setBeanFactory(BeanFactory beanFactory)
方法,将BeanFactory引用传递给Bean实例。
public interface BeanFactoryAware extends Aware {
void setBeanFactory(BeanFactory beanFactory) throws BeansException;
}
3. ApplicationContextAware接口
-
实现ApplicationContextAware:如果Bean实现了
ApplicationContextAware
接口,Spring会调用其setApplicationContext(ApplicationContext ctx)
方法,将ApplicationContext引用传递给Bean实例。
public interface ApplicationContextAware extends Aware {
void setApplicationContext(ApplicationContext applicationContext) throws BeansException;
}
4. BeanPostProcessor接口(前置、后置处理)
-
BeanPostProcessor处理:在Bean初始化前后,Spring容器会调用所有实现了
BeanPostProcessor
接口的Bean的postProcessBeforeInitialization
和postProcessAfterInitialization
方法。这允许开发者修改Bean的属性值或进行其他处理。
public interface BeanPostProcessor {
@Nullable
default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
@Nullable
default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
}
5. InitializingBean接口
-
实现InitializingBean:如果Bean实现了
InitializingBean
接口,Spring会调用其afterPropertiesSet()
方法。这个方法在属性填充后被调用,用于执行初始化代码。
public interface InitializingBean {
void afterPropertiesSet() throws Exception;
}
注意:InitializingBean接口在BeanPostProcessor.postProcessBeforeInitialization之后,BeanPostProcessor.postProcessAfterInitialization方法之前执行
6. 自定义初始化方法
-
自定义初始化方法:可以在配置文件中指定一个或多个初始化方法,这些方法会在属性填充和BeanPostProcessor处理之后被调用。例如,可以通过
@PostConstruct
注解标注的方法来实现。@PostConstruct
注解方法
JSR-250 标准注解,由 Spring 的CommonAnnotationBeanPostProcessor
处理。InitializingBean.afterPropertiesSet()
Spring 接口方法,在@PostConstruct
之后执行。- 自定义初始化方法
通过 XML 配置的init-method
属性、@Bean(initMethod="...")
或@Configuration
类中的方法指定。
通过@PostConstruct
注解标注的方法来实现:
@PostConstruct
public void init() {
System.out.println("Bean is initialized");
}
7. 使用Bean
-
Bean准备就绪:此时,Bean已经完全初始化并可以使用了。
8. 销毁
-
销毁Bean:当容器关闭时,所有Singleton作用域的Bean都会被销毁。如果Bean实现了
DisposableBean
接口,Spring会调用其destroy()
方法;或者如果有指定了自定义的销毁方法(例如通过@PreDestroy
注解),这些方法也会被调用。
public interface DisposableBean {
void destroy() throws Exception;
}
9.spring bean生命周期总结
生命周期阶段 | 包含步骤 |
实例化 | 实例化 |
属性填充 | 属性填充 |
初始化 | Aware 接口回调 → BeanPostProcessor 前置 → @PostConstruct → InitializingBean → 自定义 init-method → BeanPostProcessor 后置 |
使用 | 使用Bean |
销毁 | 销毁Bean |