为什么要实现InitializingBean接口?
为什么要实现InitializingBean接口?
### 💡 核心目的:在Spring容器完成依赖注入后执行自定义初始化
```java
@Override
public void afterPropertiesSet() throws Exception {
initHandler(); // 🎯 关键:初始化事件处理映射关系
}
private void initHandler() {
// 建立事件代码与执行场景的映射关系
handlerMapping.put(TRADE_ORDER_PAID, OrderExecuteSceneEnum.ORDER_PAID);
handlerMapping.put(TRADE_ORDER_CANCELLED, OrderExecuteSceneEnum.ORDER_CANCEL);
handlerMapping.put(ORDER_APPLICATION_CREATED, OrderExecuteSceneEnum.ORDER_APPLICATION_CREATED);
// ... 更多映射关系
// 🔧 根据映射关系生成消费标签数组
tags = handlerMapping.keySet().stream()
.map(EventCodeEnum::getCode)
.toArray(String[]::new);
}
```
---
## 📚 三、InitializingBean的应用场景
### 🔧 场景1:数据结构初始化
```java
@Override
public void afterPropertiesSet() {
// 初始化Map、集合等数据结构
handlerMapping.put(key, value);
cacheMap.putAll(loadInitialData());
}
```
### ✅ 场景2:配置验证
```java
@Override
public void afterPropertiesSet() {
Assert.notNull(someRequiredProperty, "必要的配置不能为空");
Assert.hasText(configPath, "配置路径不能为空");
validateConfiguration();
}
```
### 🔗 场景3:资源初始化
```java
@Override
public void afterPropertiesSet() {
// 建立数据库连接池
initConnectionPool();
// 创建线程池
initThreadPool();
// 初始化缓存
initCache();
// 加载配置文件
loadConfigFiles();
}
```
### 📡 场景4:注册回调或监听器
```java
@Override
public void afterPropertiesSet() {
eventPublisher.registerListener(this);
registry.register(this);
schedulerService.schedule(this);
}
```
---
## 🔄 四、InitializingBean的替代方案
### 1️⃣ 使用@PostConstruct注解(推荐)
```java
@PostConstruct
public void init() {
initHandler();
}
```
### 2️⃣ 在@Bean方法中指定initMethod
```java
@Bean(initMethod = "init")
public MyService myService() {
return new MyService();
}
```
### 3️⃣ 实现BeanPostProcessor
```java
@Component
public class CustomBeanPostProcessor implements BeanPostProcessor {
// 自定义后处理逻辑
}
```
---
## 💎 五、最佳实践建议
### ✨ 1. 优先使用@PostConstruct
- 更加直观和简洁
- 不需要实现额外接口
- 符合JSR-250规范
### ⚡ 2. 注意初始化顺序
- 构造函数 → 依赖注入 → `@PostConstruct` / `afterPropertiesSet()`
### 🛡️ 3. 异常处理要到位
```java
@Override
public void afterPropertiesSet() throws Exception {
try {
initHandler();
} catch (Exception e) {
log.error("初始化失败", e);
throw e;
}
}
```

浙公网安备 33010602011771号