@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()
}
}

Spring @Value取值为null或@Autowired注入失败的更多相关文章

  1. @Value取值为NULL的解决方案------https://blog.csdn.net/zzmlake/article/details/54946346

    @Value取值为NULL的解决方案 https://blog.csdn.net/zzmlake/article/details/54946346

  2. 【Intellij idea】spring中@Autowired注入失败

    @Autowired注入失败失败的解决办法? 现有的解决的方案是: 打开file-settings或者ctrl+alt+s -> Editor 然后在Inspections 点击搜索栏 输入Sp ...

  3. spring boot开发 @autowired注入失败

    @autowired注入失败 会出现如下错误提示: 2018-05-28 08:39:41.857 INFO 8080 --- [ restartedMain] org.hibernate.Versi ...

  4. @Value取值为NULL的解决方案

    在spring mvc架构中,如果希望在程序中直接使用properties中定义的配置值,通常使用一下方式来获取: @Value("${tag}") private String ...

  5. ajax post请求request.getParameter("")取值为null

    今天在写提交一个json数据到后台,然后后台返回一个json数据类型.但是发现后台通过request.getParamter("")取到的值为null. 于是写一个简单的ajax ...

  6. nacos作为配置中心动态刷新@RefreshScope添加后取值为null的一个问题

    之前springboot项目常量类如下形式: @Component @RefreshScope//nacos配置中心时添加上 public class Constants { @Value(" ...

  7. Spring Autowired 注入失败总是Null

    报错:NullPointerException 分析:错误原因是注入失败? <context:annotation-config/> <context:component-scan ...

  8. 当spring 对象@Autowired 注入失败或者创建对象Bean失败、No qualifying bean/Error creating bean 的失败情形分析和解决方案

    错误信息 今天开发的过程中突然出现如下错误: Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: N ...

  9. SpringBoot整合axis1.4后,@Autowired注入失败,使用工具类注入

    问题描述: 费劲心思搭建好webservices服务端后,没想到客户端调用失败,查看日志文件,发现报空指针异常,debug代码后,发现sql查询的值都是null.通常情况下,我们将Dao注入Servi ...

随机推荐

  1. vue双向绑定的简单实现(原创)

    简单模拟一下vue的双向绑定实现,代码比较粗糙,菜鸟一枚,欢迎各位大佬斧正 1.实验环境: 利用a.b两个input,a代表页面中的数据,b代表data中的数据 2.原理: 利用Object.defi ...

  2. upload三种上传方式(上)---Servlet---post---commons-fileupload.1.2.1.jar方式请求上传文件

    上传前进行的配置选项: 1.在下方的Servers中,右键你的tomcat--open,选中下面两个配置. 第一个:Serve modules without publishing 作用:tomcat ...

  3. JdbcTemplate 多数据源 jdbc

    参考: https://www.cnblogs.com/tangzekai/p/7782773.html 配置: package top.zekk.twodatasource.config; impo ...

  4. 今日、本周、本月时间列表 python方法

    def get_time(self): ''' @author : Cong @Email : 624420781@qq.com @描 述 : 生产时间列表 ''' # 生成本日时间列表 i = da ...

  5. 学习python 检测字符串的方法

    检测字符串长度的方法:len() 检测字符串是否含有字母的方法:str.isalpha() 检测字符串是否含有数字的方法:str.isnumeric() 检测字符串是否有大写字母:str.upper( ...

  6. chrome调试vue.js的插件:vue.js devtools

    1.什么是vue.js devtools? vue.js devtools是chrome的一款插件,用来调试vue的一款神器. 2.为什么下载vue.js devtools? 由于vue是数据驱动的, ...

  7. rm命令详解

    1.简介: rm是常用的命令,该命令的功能为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所有文件及子目录均删除.对于链接文件,只是删除了链接,原有文件均保持不变. 注意:rm是一个 ...

  8. 针对Oracle数据库中SCOTT方案的多表查询的一个例子

    查询出每个员工的姓名.职位.月薪.所属部门名.月薪等级及其领导的姓名.职位.所属部门名.月薪等级.select e.ename 员工姓名,e.job 员工职位,e.sal 员工月薪,d.dname 员 ...

  9. CSS 布局术语

    这一节的知识非常重要,它关系到能否做出漂亮的网站.下面的概念.术语需要好好理解. 构建块:CSS采用盒子模型来处理每个HTML元素.盒子可以是一个“块级”盒子,也可以是一个“内联”盒子. 包含元素:包 ...

  10. 深入理解C++11【4】

    [深入理解C++11[4]] 1.基于范围的 for 循环 C++98 中需要告诉编译器循环体界面范围.如for,或stl 中的for_each: int main() { ] = { , , , , ...