有些时候,我们可能需要给静态变量注入 spring bean,尝试过使用 @Autowired 给静态变量做注入的同学应该都能发现注入是失败的。
@Autowired 给静态变量注入bean 失败的原因
spring 底层已经限制了,不能给静态属性注入值:
如果我们有这种需要的话,应该怎么做呢?
一般做法:applicationContext + InitializingBean
@Component
public class FooService implements InitializingBean {
private static AlarmService alarmService;
@Autowired
private ApplicationContext applicationContext;
public static void sendAlarm(Request req) {
alarmService.sendAlarm(req);
}
@Override
public void afterPropertiesSet() {
alarmService = applicationContext.getBean(AlarmService.class);
}
}
最佳实践:构造注入
使用构造注入的方式,在构造方法中给静态变量赋值
@Component
public class FooService {
private static AlarmService alarmService;
public FooService(AlarmService alarmService) {
this.alarmService = alarmService;
}
public static void sendAlarm(Request req) {
alarmService.sendAlarm(req);
}
.......
}