有些时候,我们可能需要给静态变量注入 spring bean,尝试过使用 @Autowired 给静态变量做注入的同学应该都能发现注入是失败的。
@Autowired 给静态变量注入bean 失败的原因
spring 底层已经限制了,不能给静态属性注入值:
如果我们有这种需要的话,应该怎么做呢?
一般做法:applicationContext + InitializingBean
@Component
public class FooService implements InitializingBean {private static AlarmService alarmService;@Autowiredprivate ApplicationContext applicationContext;public static void sendAlarm(Request req) {alarmService.sendAlarm(req);}@Overridepublic 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);}.......
}