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; } }
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
springboot中使用undertow踩坑记(最新推荐)
这篇文章主要介绍了springboot中使用undertow踩坑记,springboot内置类web中间件,将web服务器管理权交给了容器,本文分步骤给大家介绍的非常详细,需要的朋友可以参考下2024-08-08
最新评论