Spring 框架通过 IOC 容器管理 Bean 的创建、依赖注入、初始化、销毁等全过程。只有深入理解生命周期机制,才能精准控制资源管理、插件装配、埋点监控、AOP 注入等关键操作,特别是在做中间件封装或 Starter 开发时尤为重要。
beanInstance = createBeanInstance(beanName, mbd, args);
调用链:
AbstractAutowireCapableBeanFactory#createBean()
→ doCreateBean()
→ createBeanInstance()
说明:
populateBean(beanName, mbd, instanceWrapper);
调用链:
→ doCreateBean()
→ populateBean()
说明:
initializeBean(beanName, exposedObject, mbd);
包括以下子步骤:
BeanNameAware#setBeanName
BeanFactoryAware#setBeanFactory
ApplicationContextAware#setApplicationContext
createBean()
├─ createBeanInstance()
├─ populateBean()
├─ initializeBean()
│ ├─ invokeAwareMethods()
│ ├─ applyBeanPostProcessorsBeforeInitialization()
│ ├─ invokeInitMethods()
│ └─ applyBeanPostProcessorsAfterInitialization()
// 自定义BeanPostProcessor示例
@Component
public class CustomBeanPostProcessor implements BeanPostProcessor, Ordered {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) {
// 前置处理逻辑
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) {
// 后置处理逻辑
return bean;
}
@Override
public int getOrder() {
return Ordered.HIGHEST_PRECEDENCE; // 控制执行顺序
}
}
// 修改BeanDefinition示例
@Component
public class CustomBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
BeanDefinition bd = beanFactory.getBeanDefinition("dataSource");
bd.getPropertyValues().add("maxPoolSize", 50);
}
}
graph LR
A[DisposableBean.destroy] --> B[@PreDestroy]
B --> C[destroy-method]
// DisposableBeanAdapter.destroy()
public void destroy() {
// 1. 调用@PreDestroy方法
for (LifecycleElement element : this.destroyMethods) {
element.invoke(target);
}
// 2. 调用DisposableBean接口
if (this.invokeDisposableBean) {
((DisposableBean) this.bean).destroy();
}
// 3. 调用自定义destroy-method
if (this.destroyMethod != null) {
invokeCustomDestroyMethod(this.destroyMethod);
}
}
在DDD中,聚合根是领域模型的核心,其生命周期管理尤为重要:
@AggregateRoot // DDD聚合根注解
@Entity
public class Order {
@Id
private Long id;
private OrderStatus status;
// 领域行为
public void pay() {
if (status != OrderStatus.CREATED) {
throw new DomainException("订单状态异常");
}
this.status = OrderStatus.PAID;
registerEvent(new OrderPaidEvent(this.id)); // 发布领域事件
}
}
@Component
public class AggregateLifecyclePostProcessor implements BeanPostProcessor {
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) {
if (bean instanceof Order) {
// 初始化后加载聚合历史
((Order) bean).loadFromHistory();
}
return bean;
}
@Override
public void postProcessBeforeDestruction(Object bean, String beanName) {
if (bean instanceof Order) {
// 销毁前保存聚合状态
((Order) bean).saveState();
}
}
}
根据您提供的事件风暴工作坊内容,我们可以将领域事件与Bean生命周期结合:
@Component
public class LifecycleMonitorPostProcessor
implements BeanPostProcessor, DestructionAwareBeanPostProcessor {
private static final Logger logger = LoggerFactory.getLogger(LifecycleMonitorPostProcessor.class);
// 创建时间跟踪
private final Map<String, Long> creationStartTime = new ConcurrentHashMap<>();
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) {
creationStartTime.put(beanName, System.currentTimeMillis());
logger.info("Bean初始化开始: {}", beanName);
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) {
Long startTime = creationStartTime.get(beanName);
if (startTime != null) {
long cost = System.currentTimeMillis() - startTime;
logger.info("Bean初始化完成: {}, 耗时: {}ms", beanName, cost);
}
// 捕获领域事件
if (bean instanceof Order) {
((Order) bean).addDomainEventListener(event -> {
logger.info("捕获领域事件: {}", event.getClass().getSimpleName());
});
}
return bean;
}
@Override
public void postProcessBeforeDestruction(Object bean, String beanName) {
logger.info("Bean销毁开始: {}", beanName);
// 资源释放监控
if (bean instanceof DataSource) {
monitorDataSourceClose((DataSource) bean);
}
}
private void monitorDataSourceClose(DataSource dataSource) {
// 记录连接池关闭状态
}
}
2023-10-01 10:00:00 [INFO] Bean初始化开始: orderService
2023-10-01 10:00:01 [INFO] Bean初始化完成: orderService, 耗时: 1200ms
2023-10-01 10:00:05 [INFO] 捕获领域事件: OrderPaidEvent
2023-10-01 10:05:00 [INFO] Bean销毁开始: dataSource
2023-10-01 10:05:01 [INFO] 连接池关闭成功, 释放连接数: 20
@Component
public class DatabaseInitializer implements InitializingBean, DisposableBean {
private ExecutorService threadPool;
@Override
public void afterPropertiesSet() throws Exception {
// 初始化线程池
threadPool = Executors.newFixedThreadPool(5);
// 加载数据库脚本
executeSqlScript("init.sql");
}
@Override
public void destroy() throws Exception {
// 优雅关闭线程池
threadPool.shutdown();
if (!threadPool.awaitTermination(30, TimeUnit.SECONDS)) {
threadPool.shutdownNow();
}
// 清理临时文件
cleanTempFiles();
}
}
@Configuration
public class SchedulerConfig {
@Bean
public ThreadPoolTaskScheduler taskScheduler() {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setPoolSize(5);
scheduler.setThreadNamePrefix("scheduler-");
return scheduler;
}
@Bean
public SchedulerManager schedulerManager(ThreadPoolTaskScheduler scheduler) {
return new SchedulerManager(scheduler);
}
}
@Component
public class SchedulerManager implements DisposableBean {
private final ThreadPoolTaskScheduler scheduler;
public SchedulerManager(ThreadPoolTaskScheduler scheduler) {
this.scheduler = scheduler;
}
@Override
public void destroy() throws Exception {
// 停止所有任务
scheduler.shutdown();
if (!scheduler.getScheduledThreadPoolExecutor().awaitTermination(10, TimeUnit.SECONDS)) {
scheduler.getScheduledThreadPoolExecutor().shutdownNow();
}
}
}
// 在Starter中自动配置
@Configuration
@AutoConfigureAfter(DataSourceAutoConfiguration.class)
public class ConnectionPoolMonitorAutoConfiguration {
@Bean
public ConnectionPoolMonitorPostProcessor connectionPoolMonitorPostProcessor() {
return new ConnectionPoolMonitorPostProcessor();
}
}
public class ConnectionPoolMonitorPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) {
if (bean instanceof DataSource) {
// 监控连接池状态
monitorDataSource((DataSource) bean);
}
return bean;
}
}
@Component
public class ApplicationLifecycleListener
implements ApplicationListener<ContextClosedEvent> {
@Override
public void onApplicationEvent(ContextClosedEvent event) {
// 应用关闭时释放资源
releaseGlobalResources();
}
}
Spring Bean生命周期管理体现了控制反转的设计哲学。深入理解其机制,不仅能解决实际开发中的资源管理问题,更能为设计高扩展性框架提供理论基础。在云原生时代,结合Spring Boot的自动配置和Starter机制,生命周期管理已成为构建健壮应用的核心能力。