Spring中@Value注解獲取不到配置值問題及解決
@Value注解必須要在spring的bean中才能使用,不能自己new一個(gè)對(duì)象調(diào)用
產(chǎn)生原因:
在SpringBoot中使用@Value只能給普通變量賦值,不能給靜態(tài)變量賦值
解決方法:
給靜態(tài)變量增加一個(gè)非靜態(tài)的set方法,注意需要把@Value注解寫到對(duì)應(yīng)的set方法上,而不是定義的靜態(tài)變量上,
如下所示:
@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、碰到過三種情況導(dǎo)致@Value獲取不到配置值
- 變量被關(guān)鍵字static修飾
- 類沒有使用@Component及其衍生標(biāo)簽修飾
- 在Bean初始化時(shí)構(gòu)造方法中引用被@Value修飾的變量
需要獲取的配置如下
kafka:
bootstrap:
servers: 192.168.202.131:9092
servers:
first:
topic: "first_topic"
group: "first_group" 
測(cè)試項(xiàng)目是springboot的,如果是普通spring項(xiàng)目的application.properties文件也是類似
2、變量被關(guān)鍵字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修飾的參數(shù)使用@Value無法獲取到配置值
3、類沒有使用@Component及其衍生標(biāo)簽修飾
因?yàn)锧Value是在AbstractAutowireCapableBeanFactory類的doCreateBean方法中進(jìn)行初始化,
即交由Spring容器進(jìn)行處理,
如果沒有@Component及其衍生注解注釋Spring無法識(shí)別,導(dǎo)致無法獲取到配置值。
4、在Bean初始化時(shí)構(gòu)造方法中引用被@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初始化時(shí)在構(gòu)造方法中無法獲取到@Value修飾的參數(shù)值
解決方法:
如果需要在bean初始化時(shí)獲取參數(shù)值,那么我們可以使用@Config注解在bean初始化時(shí)獲取到,
代碼如下:
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;
}
}
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java線程通訊的實(shí)現(xiàn)方法總結(jié)
線程通訊指的是多個(gè)線程之間通過共享內(nèi)存或消息傳遞等方式來協(xié)調(diào)和同步它們的執(zhí)行,線程通訊的實(shí)現(xiàn)方式主要有以下兩種:共享內(nèi)存和消息傳遞,本文詳細(xì)介紹了Java線程是如何通訊的,感興趣的同學(xué)可以參考閱讀2023-05-05
java 與testng利用XML做數(shù)據(jù)源的數(shù)據(jù)驅(qū)動(dòng)示例詳解
這篇文章主要介紹了java 與testng利用XML做數(shù)據(jù)源的數(shù)據(jù)驅(qū)動(dòng)示例詳解的相關(guān)資料,需要的朋友可以參考下2017-01-01
SpringBoot中多環(huán)境啟動(dòng)配置的教程詳解
在SpringBoot項(xiàng)目的生命周期中,存在不同的環(huán)境,我們就需要針對(duì)不同環(huán)境制定不同名稱的配置文件,里面放置不同環(huán)境下所需的配置項(xiàng),下面小編就來和大家詳細(xì)講講SpringBoot如何進(jìn)行多環(huán)境啟動(dòng)配置的吧2024-02-02
RabbitMQ 的消息持久化與 Spring AMQP 的實(shí)現(xiàn)詳解
這篇文章主要介紹了RabbitMQ 的消息持久化與 Spring AMQP 的實(shí)現(xiàn)剖析詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08
在Intellij Idea中使用jstl標(biāo)簽庫的方法
這篇文章主要介紹了在Intellij Idea中使用jstl標(biāo)簽庫的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-05-05

