开发时遇到一个问题,Springboot的@Autowired失效,无法注入bean,获取的到的mqttProperties一直为空。
MqttProperties定义:
业务代码:
按理来说,我的MqttProperties和当前类 NettyMqttClient都注册为了bean,依赖注入应该没问题的,但是MqttProperties一直为空。和泽森讨论后发现MqttClient类声明为了属性,导致MqttClient对象在getMqttClient()方法之前就初始化,此时SpringBoot的bean还未注入,所以取到的值是空。
问题出在MqttClient的实例化时机。Bean的注入通常发生在当前bean的实例化之后。我这里MqttClient的实例化是在类的成员变量处进行的,而不是作为一个Spring Bean被管理。
类加载顺序:
1、父类优先于子类
2、属性优先于代码块优先于构造方法
3、静态优先于非静态
4、bean依赖注入在类初始化之后
解决方法:
1.将MqttClient声明为Spring Bean:将MqttClient声明为一个Spring Bean,通过依赖注入的方式获取MqttClient实例。这样Spring容器会负责实例化MqttClient并处理依赖注入
2.在方法中使用MqttClient:在方法中初始化MqttClient可以确保在此之前MqttProperties已经被注入了。