一、生命周期阶段概览
Spring Bean 的生命周期贯穿容器管理全过程,包含以下核心阶段:
二、关键接口与注解
阶段 | 接口 | 注解 | XML 配置 |
---|---|---|---|
实例化 | InstantiationAwareBeanPostProcessor | - | - |
属性注入 | BeanPostProcessor | @Autowired | <property> |
初始化前 | BeanPostProcessor.postProcessBeforeInitialization | - | - |
初始化 | InitializingBean.afterPropertiesSet | @PostConstruct | init-method |
初始化后 | BeanPostProcessor.postProcessAfterInitialization | - | - |
销毁前 | DisposableBean.destroy | @PreDestroy | destroy-method |
销毁 | BeanFactory 关闭时自动触发 | - | - |
三、生命周期详细流程
-
实例化阶段
// 通过构造函数创建Bean实例 public class UserService { public UserService() { System.out.println("UserService实例化"); } }
-
属性注入阶段
@Service public class OrderService { @Autowired private UserService userService; // 依赖注入 }
-
初始化前处理
public class CustomBeanPostProcessor implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) { if ("userService".equals(beanName)) { System.out.println("初始化前处理:" + beanName); } return bean; } }
-
初始化阶段
@Service public class PaymentService implements InitializingBean { @Override public void afterPropertiesSet() throws Exception { System.out.println("PaymentService初始化"); } @PostConstruct public void init() { System.out.println("通过@PostConstruct初始化"); } }
-
初始化后处理
public class CustomBeanPostProcessor implements BeanPostProcessor { @Override public Object postProcessAfterInitialization(Object bean, String beanName) { if ("paymentService".equals(beanName)) { System.out.println("初始化后处理:" + beanName); } return bean; } }
-
销毁阶段
@Service public class CacheService implements DisposableBean { @Override public void destroy() throws Exception { System.out.println("CacheService销毁"); } @PreDestroy public void cleanUp() { System.out.println("通过@PreDestroy清理资源"); } }
四、容器管理流程
Spring 容器通过refresh()
方法启动生命周期管理:
public ConfigurableListableBeanFactory refreshBeanFactory() {
// 1. 创建BeanFactory
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
// 2. 注册BeanPostProcessor
beanFactory.addBeanPostProcessor(new CustomBeanPostProcessor());
// 3. 实例化所有singleton Bean
beanFactory.preInstantiateSingletons();
return beanFactory;
}
五、扩展生命周期的方式
-
BeanPostProcessor
public class LoggingBeanPostProcessor implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) { System.out.println("Bean [" + beanName + "] 初始化前"); return bean; } }
-
FactoryBean
public class DataSourceFactoryBean implements FactoryBean<DataSource> { @Override public DataSource getObject() throws Exception { DataSource dataSource = new HikariDataSource(); // 初始化数据源 return dataSource; } }
-
SmartInitializingSingleton
public class StartupService implements SmartInitializingSingleton { @Override public void afterSingletonsInstantiated() { System.out.println("所有singleton Bean初始化完成"); } }
六、最佳实践建议
-
资源管理
- 在
@PostConstruct
中初始化外部资源(数据库连接、线程池等) - 在
@PreDestroy
中释放资源
- 在
-
避免循环依赖
// 错误示例:ServiceA与ServiceB相互依赖 @Service public class ServiceA { @Autowired private ServiceB serviceB; }
-
代理对象生命周期
- 当 Bean 被 AOP 代理时,
@PostConstruct
在代理对象中执行 - 使用
AopContext.currentProxy()
获取代理对象
- 当 Bean 被 AOP 代理时,
-
作用域管理
- prototype Bean 不会触发销毁方法
- 使用
@RequestScope
需配合RequestContextListener
七、常见问题诊断
-
Bean 未初始化
- 检查是否遗漏
@Component
等注解 - 确认配置类是否被扫描
- 检查是否遗漏
-
销毁方法未执行
- 确保容器正常关闭(调用
close()
方法) - 非 singleton Bean 需手动管理
- 确保容器正常关闭(调用
-
循环依赖排查
# 使用Spring Boot Actuator查看依赖关系 curl http://localhost:8080/beans
八、总结
掌握 Spring Bean 生命周期有助于:
- 优化资源初始化与释放
- 解决依赖注入问题
- 实现复杂初始化逻辑
- 诊断容器启动异常
通过合理使用生命周期接口和注解,可以构建更健壮的 Spring 应用。建议结合具体业务场景选择合适的扩展方式,避免过度设计。