文章目录
- 什么是Bean生命周期
- Bean生命周期的完整流程
-
- [1. BeanDefinition处理阶段](#1. BeanDefinition处理阶段)
- [2. 实例化阶段](#2. 实例化阶段)
- [3. 属性注入阶段](#3. 属性注入阶段)
- [4. Aware接口回调阶段](#4. Aware接口回调阶段)
- [5. BeanPostProcessor前置处理](#5. BeanPostProcessor前置处理)
- [6. 初始化阶段](#6. 初始化阶段)
- [7. BeanPostProcessor后置处理](#7. BeanPostProcessor后置处理)
- [8. Bean使用阶段](#8. Bean使用阶段)
- [9. 销毁阶段](#9. 销毁阶段)
- 测试类代码
- 生命周期流程图总结
什么是Bean生命周期
Bean生命周期是指Spring容器管理Bean从创建到销毁的整个过程。
Bean生命周期的完整流程
1. BeanDefinition处理阶段
在Bean实例化之前,Spring容器需要先处理BeanDefinition相关的操作:
- 配置元数据解析:Spring容器读取XML配置文件、Java配置类或注解,解析Bean的配置信息
- BeanDefinition创建:将解析的配置信息封装成BeanDefinition对象
- BeanDefinition注册:将BeanDefinition注册到BeanDefinitionRegistry中
- BeanFactoryPostProcessor处理:在Bean实例化之前,对BeanDefinition进行修改
java
@Component
public class CustomBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
System.out.println("BeanFactoryPostProcessor: 修改BeanDefinition");
// 可以修改BeanDefinition的属性
BeanDefinition beanDefinition = beanFactory.getBeanDefinition("userService");
if (beanDefinition instanceof AbstractBeanDefinition) {
// 修改作用域、懒加载等属性
beanDefinition.setScope(BeanDefinition.SCOPE_SINGLETON);
}
}
}
2. 实例化阶段
在BeanDefinition准备完成后,Spring容器开始创建Bean实例:
- Bean实例化:通过反射机制调用构造函数创建Bean实例
java
@Component
public class UserService {
public UserService() {
System.out.println("2. UserService构造函数被调用");
}
}
3. 属性注入阶段
在Bean实例创建完成后,Spring容器会为Bean注入依赖的属性:
- 依赖注入:通过setter方法、字段注入或构造函数注入依赖对象
- 属性赋值:为Bean的各个属性赋值
java
@Component
public class UserService {
@Autowired
private UserRepository userRepository;
@Value("${app.name}")
private String appName;
}
4. Aware接口回调阶段
如果Bean实现了特定的Aware接口,Spring容器会调用相应的回调方法:
java
@Component
public class UserService implements BeanNameAware {
@Override
public void setBeanName(String name) {
System.out.println("4. BeanNameAware.setBeanName()被调用,Bean名称: " + name);
}
}
常见的Aware接口包括:BeanNameAware、BeanFactoryAware、ApplicationContextAware等
5. BeanPostProcessor前置处理
在初始化之前,Spring容器会调用所有注册的BeanPostProcessor的postProcessBeforeInitialization
方法:
java
@Component
public class CustomBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("6. BeanPostProcessor.postProcessBeforeInitialization()被调用: " + beanName);
return bean;
}
}
6. 初始化阶段
这是Bean生命周期中的关键阶段,初始化方法的执行顺序为:
- @PostConstruct注解的方法
- InitializingBean接口的afterPropertiesSet()方法
- 自定义的init-method方法
java
@Component
public class UserService implements InitializingBean {
@PostConstruct
public void postConstruct() {
System.out.println("7. @PostConstruct注解的方法被调用");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("8. InitializingBean.afterPropertiesSet()被调用");
}
public void customInit() {
System.out.println("9. 自定义init方法被调用");
}
}
配置自定义init方法:
java
@Configuration
public class AppConfig {
@Bean(initMethod = "customInit")
public UserService userService() {
return new UserService();
}
}
7. BeanPostProcessor后置处理
初始化完成后,Spring容器会调用所有注册的BeanPostProcessor的postProcessAfterInitialization
方法:
java
@Component
public class CustomBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("10. BeanPostProcessor.postProcessAfterInitialization()被调用: " + beanName);
return bean;
}
}
BeanPostProcessor是Spring框架的核心扩展点之一,它的主要作用包括:
- AOP代理创建:Spring AOP通过BeanPostProcessor在初始化后创建代理对象
- Bean增强:对Bean进行包装、修改或替换
- 属性修改:在Bean初始化前后修改Bean的属性
8. Bean使用阶段
经过上述步骤后,Bean已经完全初始化并注册到单例池中,在这个阶段,Bean处于就绪状态,可以处理业务逻辑,后续对该Bean的获取都会直接从单例池中返回同一个实例。
9. 销毁阶段
当Spring容器关闭时,会销毁所有的单例Bean。销毁方法的执行顺序为:
- @PreDestroy注解的方法
- DisposableBean接口的destroy()方法
- 自定义的destroy-method方法
java
@Component
public class UserService implements DisposableBean {
@PreDestroy
public void preDestroy() {
System.out.println("11. @PreDestroy注解的方法被调用");
}
@Override
public void destroy() throws Exception {
System.out.println("12. DisposableBean.destroy()被调用");
}
public void customDestroy() {
System.out.println("13. 自定义destroy方法被调用");
}
}
测试类代码
java
public class UserServiceTest {
public static void main(String[] args) {
AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext(AppConfig.class);
UserService bean = context.getBean(UserService .class);
bean.doSomething();
// 关闭容器,触发销毁过程
context.close();
}
}
生命周期流程图总结
Bean的完整生命周期可以用以下流程概括:
BeanDefinition处理 → BeanFactoryPostProcessor处理 → Bean实例化 → 属性注入 → Aware接口回调 →
BeanPostProcessor前置处理 → 初始化方法 → BeanPostProcessor后置处理 → Bean就绪可使用 → 销毁方法
声明 :本文结合了AI和学者的知识理解,在AI生成的文章框架的基础上补充完成的。
掌握Bean生命周期不仅有助于日常开发,更是深入学习Spring框架源码和高级特性的基础。希望本文能够帮助大家更好地理解和应用Spring Bean的生命周期。