SmartInitializingSingleton
SmartInitializingSingleton在所有单例Bean实例化完成后执行回调。
接口定义
Java
public interface SmartInitializingSingleton {
void afterSingletonsInstantiated();
}
调用时机
Java
┌─────────────────────────────────────┐
│ 所有单例Bean实例化 │
├─────────────────────────────────────┤
│ 所有单例Bean初始化完成 │
├─────────────────────────────────────┤
│ SmartInitializingSingleton回调 │
│ (afterSingletonsInstantiated) │
├─────────────────────────────────────┤
│ ApplicationContext刷新完成 │
│ (发布ContextRefreshedEvent) │
└─────────────────────────────────────┘
与@PostConstruct不同,此接口确保所有Bean都已就绪。
实现示例
Java
@Component
public class CacheInitializer implements SmartInitializingSingleton {
@Autowired
private List<CacheProvider> cacheProviders;
@Override
public void afterSingletonsInstantiated() {
// 所有Bean已就绪,此时初始化缓存
for (CacheProvider provider : cacheProviders) {
provider.initialize();
}
System.out.println("缓存系统初始化完成");
}
}
与其他初始化方式对比
| 方式 | 调用时机 | 特点 |
|---|---|---|
| @PostConstruct | Bean自身初始化时 | 无法保证其他Bean就绪 |
| InitializingBean | Bean自身初始化时 | 无法保证其他Bean就绪 |
| SmartInitializingSingleton | 所有单例Bean就绪后 | 确保所有Bean可用 |
| ContextRefreshedEvent | 容器刷新完成时 | 需监听事件 |
使用场景
多Bean依赖的初始化
Java
@Component
public class RouteRegistry implements SmartInitializingSingleton {
@Autowired
private List<Controller> controllers;
private Map<String, Controller> routeMap = new HashMap<>();
@Override
public void afterSingletonsInstantiated() {
// 所有Controller已就绪,构建路由表
for (Controller controller : controllers) {
String path = controller.getPath();
routeMap.put(path, controller);
}
System.out.println("路由表构建完成,共 " + routeMap.size() + " 条路由");
}
public Controller getController(String path) {
return routeMap.get(path);
}
}
系统启动检查
Java
@Component
public class SystemHealthChecker implements SmartInitializingSingleton {
@Autowired
private DataSource dataSource;
@Autowired
private RedisTemplate redisTemplate;
@Autowired
private MessageQueue messageQueue;
@Override
public void afterSingletonsInstantiated() {
// 所有组件已就绪,执行健康检查
checkDatabase();
checkRedis();
checkMessageQueue();
System.out.println("系统健康检查完成");
}
private void checkDatabase() {
try {
dataSource.getConnection().close();
System.out.println("数据库连接正常");
} catch (Exception e) {
throw new RuntimeException("数据库连接失败", e);
}
}
}
批量Bean处理
Java
@Component
public class PluginLoader implements SmartInitializingSingleton {
@Autowired
private Map<String, Plugin> plugins;
@Override
public void afterSingletonsInstantiated() {
// 所有插件Bean已加载,执行注册
plugins.forEach((name, plugin) -> {
plugin.register();
System.out.println("插件注册: " + name);
});
}
}
SmartLifecycle对比
text
@Component
public class MySmartLifecycle implements SmartLifecycle {
private boolean running = false;
@Override
public void start() {
running = true;
System.out.println("生命周期启动");
}
@Override
public void stop() {
running = false;
System.out.println("生命周期停止");
}
@Override
public boolean isRunning() {
return running;
}
@Override
public int getPhase() {
return 0; // 控制启动顺序
}
}
| 接口 | 功能 | 特点 |
|---|---|---|
| SmartInitializingSingleton | 初始化回调 | 一次性,无生命周期 |
| SmartLifecycle | 生命周期管理 | 可启动/停止,有顺序控制 |
要点总结
- afterSingletonsInstantiated在所有单例Bean就绪后调用
- 适合需要等待其他Bean初始化的场景
- 与@PostConstruct时机不同,保证全局Bean可用
- 无生命周期概念,只执行一次
- SmartLifecycle提供完整生命周期控制
📝 发现内容有误?点击此处直接编辑