在Spring框架中,Bean的生命周期是IoC容器的核心机制。理解Bean的生命周期不仅有助于编写更健壮的代码,还能让我们充分利用Spring提供的扩展点进行高级定制。本文将全面解析Bean从创建到销毁的完整历程,揭示Spring容器背后的工作原理。
一、Bean生命周期全景图
二、Bean生命周期的8大阶段详解
阶段1:Bean的实例化(Instantiation)
触发时机:当容器需要创建Bean实例时
实现方式:
- 构造器实例化(推荐)
// 默认无参构造 public class UserService { public UserService() {} } - 静态工厂方法
public class BeanFactory { public static UserService createUserService() { return new UserService(); } } - 实例工厂方法
Supplier接口(Spring 5+)
注意:此时Bean的属性尚未注入,是一个"半成品"
阶段2:属性注入(Population)
核心过程:
- 解析
@Autowired、@Value等注解 - 处理
@Resource(JSR-250) - 填充XML定义的
<property>值
特殊依赖注入:
// 1. 注入其他Bean
@Autowired
private OrderService orderService;
// 2. 注入集合类型
@Autowired
private List<Plugin> plugins;
// 3. 注入环境属性
@Value("${app.timeout}")
private int timeout;
阶段3:Aware接口回调(Aware Interface Injection)
Spring提供了一系列Aware接口,用于获取容器基础设施:
| 接口名称 | 获取内容 | 使用场景 |
|---|---|---|
| BeanNameAware | Bean的ID | 日志记录 |
| BeanFactoryAware | BeanFactory引用 | 编程式获取Bean |
| ApplicationContextAware | ApplicationContext引用 | 访问资源文件 |
| EnvironmentAware | Environment对象 | 获取环境变量 |
示例:
public class MyBean implements ApplicationContextAware {
private ApplicationContext context;
@Override
public void setApplicationContext(ApplicationContext ctx) {
this.context = ctx;
}
}
阶段4:BeanPostProcessor前置处理(Pre-Initialization)
核心接口:BeanPostProcessor
public interface BeanPostProcessor {
// 在初始化前调用
default Object postProcessBeforeInitialization(Object bean, String beanName) {
return bean;
}
// 在初始化后调用
default Object postProcessAfterInitialization(Object bean, String beanName) {
return bean;
}
}
典型应用场景:
- 创建代理对象(如AOP)
- 字段加密/解密
- 自定义验证逻辑
阶段5:初始化方法(Initialization)
Spring提供三种初始化方式:
1. 实现InitializingBean接口
public class CacheService implements InitializingBean {
@Override
public void afterPropertiesSet() {
// 初始化缓存
}
}
2. @PostConstruct注解(推荐)
import javax.annotation.PostConstruct;
public class OrderService {
@PostConstruct
public void initOrderSystem() {
// 订单系统初始化
}
}
3. XML配置init-method
<bean class="com.example.DataService" init-method="init"/>
执行顺序:
@PostConstruct → InitializingBean → init-method
阶段6:BeanPostProcessor后置处理(Post-Initialization)
关键能力:
- 返回Bean的代理对象(如Spring AOP)
- 修改最终的Bean实例
- 执行自定义后处理逻辑
阶段7:使用期(In Use)
此时Bean已经完成所有初始化,处于就绪状态:
- 可以被其他Bean依赖
- 可以处理业务请求
- 生命周期由容器管理
重要特性:
- 默认单例作用域(Singleton)
- 可通过
@Scope注解修改作用域@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS) public class UserPreference {}
阶段8:销毁期(Destruction)
销毁前回调接口
public interface DestructionAwareBeanPostProcessor {
void postProcessBeforeDestruction(Object bean, String beanName);
}
三种销毁方式:
-
实现DisposableBean接口
public class ResourceHolder implements DisposableBean { @Override public void destroy() { // 释放资源 } } -
@PreDestroy注解(推荐)
public class DataCleaner { @PreDestroy public void cleanup() { // 清理数据 } } -
XML配置destroy-method
<bean class="com.example.FileStorage" destroy-method="release"/>
执行顺序:
@PreDestroy → DisposableBean → destroy-method
三、特殊Bean的生命周期管理
1. FactoryBean的生命周期
public class MyFactoryBean implements FactoryBean<UserService> {
@Override
public UserService getObject() {
return new UserService();
}
// 控制返回对象的初始化
@Override
public boolean isSingleton() {
return true;
}
}
特殊流程:
- 调用FactoryBean的
getObject()创建目标对象 - 目标对象走完整生命周期
- 销毁时先销毁目标对象再销毁FactoryBean
2. 作用域Bean的生命周期
| 作用域 | 创建时机 | 销毁时机 |
|---|---|---|
| Singleton | 容器启动时 | 容器关闭时 |
| Prototype | 每次getBean时 | GC回收时 |
| Request | HTTP请求到达时 | HTTP请求结束时 |
| Session | 用户会话创建时 | 会话超时或失效时 |
| Application | Web应用启动时 | 应用关闭时 |
四、Spring容器关闭流程
容器关闭时执行的操作:
- 发布
ContextClosedEvent事件 - 单例Bean的销毁处理
- 调用BeanFactory的后置处理器
- 关闭ExecutorService等资源
手动触发销毁:
// 在Spring Boot应用中
@RestController
public class ShutdownController {
@Autowired
private ConfigurableApplicationContext context;
@PostMapping("/shutdown")
public void shutdown() {
context.close(); // 触发Bean销毁
}
}
五、高级生命周期扩展点
1. SmartInitializingSingleton
在单例Bean初始化完成后执行:
public class StartupValidator implements SmartInitializingSingleton {
@Autowired
private List<SystemValidator> validators;
@Override
public void afterSingletonsInstantiated() {
validators.forEach(validator -> validator.validate());
}
}
2. Lifecycle接口
控制启停顺序:
public class MessageBroker implements Lifecycle {
private boolean running;
@Override
public void start() {
// 启动消息队列
running = true;
}
@Override
public void stop() {
// 停止消息队列
running = false;
}
@Override
public boolean isRunning() {
return running;
}
}
六、生命周期优化实战技巧
1. 启动加速方案
// 延迟初始化
@Lazy
@Service
public class HeavyInitService {
// 只在首次使用时初始化
}
2. 资源泄漏防护
@Component
public class ResourceMonitor implements BeanPostProcessor {
private final Map<String, Closeable> resources = new ConcurrentHashMap<>();
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) {
if (bean instanceof Closeable) {
resources.put(beanName, (Closeable) bean);
}
return bean;
}
@PreDestroy
public void closeAll() throws IOException {
for (Closeable resource : resources.values()) {
resource.close();
}
}
}
3. Spring Boot扩展点
// 自定义BeanPostProcessor(Spring Boot自动注册)
@Component
public class TimedBeanProcessor implements BeanPostProcessor {
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) {
return Proxy.newProxyInstance(
bean.getClass().getClassLoader(),
bean.getClass().getInterfaces(),
new TimingInvocationHandler(bean));
}
static class TimingInvocationHandler implements InvocationHandler {
// 方法执行计时逻辑
}
}
七、生命周期异常处理
常见问题及解决方案:
-
循环依赖
- 解决方案:使用setter注入代替构造器注入
- 三级缓存解决机制:
-
初始化失败
- 查看
BeanCreationException异常堆栈 - 检查
@PostConstruct方法中的逻辑
- 查看
-
内存泄漏
- 注意Prototype Bean的及时销毁
- 使用
@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS)
结语:理解生命周期的价值
深入掌握Bean生命周期可以:
- 精准控制初始化/销毁顺序
- 有效管理稀缺资源(如数据库连接、线程池)
- 实现高级扩展功能(如AOP、安全代理)
- 优化应用启动性能
- 设计更健壮的系统架构
诊断TIP:在应用启动时添加JVM参数
-Ddebug可打印Bean创建顺序:Creating shared instance of singleton bean 'userController' Creating instance of bean 'userService'
Spring Bean的生命周期体现了框架设计的精妙之处,合理利用各阶段的扩展点,可以让我们的应用既灵活又健壮。理解这些机制也是阅读Spring框架源码的重要基础。
1427

被折叠的 条评论
为什么被折叠?



