Spring @Value取值为null或@Autowired注入失败

@Value 用于注入.properties文件中定义的内容

@Autowired 用于装配bean

用法都很简单,很直接,但是稍不注意就会出错。下面就来说说我遇到的问题。

 

前两天在项目中遇到了一个问题,大致描述就是我写了如下一个类(只列出关键代码):

复制代码
@Component
@PropertySource("classpath:/config/config.properties")
public class MqttServiceClient implements IMqttServiceClient{
    @Value("${mqtt_host}")
    private String host;
    @Value("${mqtt_client}")
    private String client;

    private MqttClient mqttClient;

    public MqttService(){
    mqttClient= new MqttClient(host,client, new MemoryPersistence()); 
}
}
复制代码

并在其它类中定义了MqttServiceClient 类型的成员变量mqttServiceClient ,并用@Autowired注解进行注入,如下:

public class A{
    @Autowired
    private MqttServiceClient  mqttServiceClient ;  

    ...
}

 

然后运行时发现host和client总是为null,就是没有注入。但是各个配置都是对的,在项目中的其它类用同样的方法使用@Value注解时,就能够取到值。

提示的报错信息是MqttServiceClient 这个bean不能正确的创建。

    一开始我以为是因为@Value注解没有正确取值导致MqttServiceClient 类的构造函数不能正常运行从而导致的错误,所以没在意提示的错误。

后来才发现,我所有的用法都没错,错就错在我重写的构造函数上:

    因为Java类会先执行构造方法,然后再给注解了@Value的成员变量注入值(@Autowired也一样),所以在执行构造方法的时候,就会报错。

我的解决办法是,把@Value注解的属性写入一个AppConfig类中,然后在MqttServiceClient 中注入AppConfig类的对象,并用构造器注入,这样可以明确成员变量的加载顺序。

如下:

复制代码
public class MqttServiceClient implements IMqttServiceClient{

    private AppConfig appConfig;
    private MqttClient mqttClient;

    @Autowired
    public MqttServiceClient(AppConfig appConfig){
        this.appConfig = appConfig;
        mqttClient = new MqttClient (appConfig.getHost(), appconfig.getClient, new MemoryPersistence()
}
}
复制代码

转载于:https://www.cnblogs.com/DjangoBlogs/p/9213069.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值