Spring中@Value注解获取不到配置值问题及解决

 更新时间:2023年09月21日 10:11:31   作者:已被格式化的叔叔  
这篇文章主要介绍了Spring中@Value注解获取不到配置值问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

@Value注解必须要在spring的bean中才能使用,不能自己new一个对象调用

产生原因:

在SpringBoot中使用@Value只能给普通变量赋值,不能给静态变量赋值

解决方法:

给静态变量增加一个非静态的set方法,注意需要把@Value注解写到对应的set方法上,而不是定义的静态变量上,

如下所示:

@Value("${authox.sql.url}")
public void setUrl(String url) {
    JdbcUtils.url = url;
}
@Value("${authox.sql.username}")
public void setUser(String user) {
    JdbcUtils.user = user;
}
@Value("${authox.sql.password}")
public void setPassword(String password) {
    JdbcUtils.password = password;
}
@Value("${authox.sql.driver-class-name}")
public void setDriver(String driver) {
    JdbcUtils.driver = driver;
}

1、碰到过三种情况导致@Value获取不到配置值

  • 变量被关键字static修饰
  • 类没有使用@Component及其衍生标签修饰
  • 在Bean初始化时构造方法中引用被@Value修饰的变量

需要获取的配置如下

kafka:
  bootstrap:
      servers: 192.168.202.131:9092
  servers:
      first:
          topic: "first_topic"
          group: "first_group"

 

测试项目是springboot的,如果是普通spring项目的application.properties文件也是类似

2、变量被关键字static修饰

package com.coline.codeskills.kafka;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
 * @author: Coline
 * @ClassName: TestValue
 * @Date: 2020/3/1 23:58
 * @Description: test @Value Tag
 */
@Component
public class TestValue implements InitializingBean {
    @Value("${kafka.bootstrap.servers}")
    private String kafkaServers;
    @Value("${kafka.servers.first.topic}")
    private static String topic;
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println(kafkaServers);
        System.out.println(topic);
    }
}

可以看到被static修饰的参数使用@Value无法获取到配置值

3、类没有使用@Component及其衍生标签修饰

因为@Value是在AbstractAutowireCapableBeanFactory类的doCreateBean方法中进行初始化,

即交由Spring容器进行处理,

如果没有@Component及其衍生注解注释Spring无法识别,导致无法获取到配置值。

4、在Bean初始化时构造方法中引用被@Value修饰的变量

package com.coline.codeskills.kafka;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
 * @author: Coline
 * @ClassName: TestValue
 * @Date: 2020/3/1 23:58
 * @Description: test @Value Tag
 */
@Component
public class TestValue {
    @Value("${kafka.bootstrap.servers}")
    private String kafkaServers;
    @Value("${kafka.servers.first.topic}")
    private static String topic;
    public TestValue(){
        System.out.println(kafkaServers);
    }
}

如图,bean初始化时在构造方法中无法获取到@Value修饰的参数值

解决方法:

如果需要在bean初始化时获取参数值,那么我们可以使用@Config注解在bean初始化时获取到,

代码如下:

package com.coline.codeskills.common.config;
import com.coline.codeskills.kafka.TestValue;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
/**
 * @author: Coline
 * @ClassName: TestValueConfig
 * @Date: 2020/3/2 0:44
 * @Description: TODO
 */
@Configuration
public class TestValueConfig {
    @Value("${kafka.bootstrap.servers}")
    private String kafkaServers;
    @Primary
    @Bean
    public TestValue testValue(){
        TestValue testValue = new TestValue();
        return testValue;
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java使用ArrayList实现扑克牌的示例代码

    Java使用ArrayList实现扑克牌的示例代码

    学习了关于集合类的知识,我们可以做一个小项目来加深对集合类知识的学习!本文就来利用ArrayList实现扑克牌发牌洗牌效果,需要的可以参考一下
    2022-10-10
  • 学习Java内存模型JMM心得

    学习Java内存模型JMM心得

    这篇文章主要介绍了学习Java内存模型JMM的心得以及对其原理做了深入的介绍,有兴趣的朋友学习下吧。
    2017-12-12
  • java设计模式--建造者模式详解

    java设计模式--建造者模式详解

    这篇文章主要介绍了Java设计模式之建造者模式,结合具体实例形式分析了建造者模式的概念、原理、实现方法与相关使用注意事项,需要的朋友可以参考下
    2021-07-07
  • SpringBoot自定义转换器应用实例讲解

    SpringBoot自定义转换器应用实例讲解

    SpringBoot在响应客户端请求时,将提交的数据封装成对象时,使用了内置的转换器,SpringBoot 也支持自定义转换器,这个内置转换器在 debug的时候,可以看到,提供了124个内置转换器
    2022-08-08
  • Java如何通过枚举实现有限状态机

    Java如何通过枚举实现有限状态机

    这篇文章主要介绍了Java如何通过枚举实现有限状态机,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • 三道java新手入门面试题,通往自由的道路--JVM

    三道java新手入门面试题,通往自由的道路--JVM

    这篇文章主要为大家分享了最有价值的3道JVM面试题,涵盖内容全面,包括数据结构和算法相关的题目、经典面试编程题等,对hashCode方法的设计、垃圾收集的堆和代进行剖析,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • 深入理解spring的AOP机制原理

    深入理解spring的AOP机制原理

    本篇文章主要介绍了深入理解spring的AOP机制原理,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • 关于@Transactional事务表被锁的问题及解决

    关于@Transactional事务表被锁的问题及解决

    这篇文章主要介绍了关于@Transactional事务表被锁的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • 教你Java中的Lock锁底层AQS到底是如何实现的

    教你Java中的Lock锁底层AQS到底是如何实现的

    本文是基于ReentrantLock来讲解,ReentrantLock加锁只是对AQS的api的调用,底层的锁的状态(state)和其他线程等待(Node双向链表)的过程其实是由AQS来维护的,对Java Lock锁AQS实现过程感兴趣的朋友一起看看吧
    2022-05-05
  • 一篇文章带你深入理解JVM虚拟机读书笔记--锁优化

    一篇文章带你深入理解JVM虚拟机读书笔记--锁优化

    这篇文章深入介绍了JVM虚拟机的锁优化,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2021-09-09

最新评论