有些时候,我们可能需要给静态变量注入 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);
    }
    .......
}



















