Spring?Boot?如何正確讀取配置文件屬性
前言
項(xiàng)目中經(jīng)常會(huì)經(jīng)常讀取配置文件中的屬性的值,Spring Boot提供了很多注解讀取配置文件屬性,那么如何正確使用呢?

@Value
@Value用來(lái)讀取application.yml配置文件中屬性的值。
示例代碼
application.yml文件中屬性:
//定義屬性 fileName : test isFile : false filePath : c://test
@value讀取application.yml屬性值:
@Configuration
public class FileConfig
{
@Value("${fileName}")
private final String fileName;
@Value("${isFile}")
private boolean isFile;
@Value("${filePath}")
private static String filePath;
}測(cè)試:
@Autowired
private FileConfig fileConfig;
@GetMapping("getFileConfig")
public void getFileConfig()
{
logger.info("fileConfig:{}",fileConfig);
}運(yùn)行結(jié)果:
fileConfig:FileConfig [fileName=, isFile=false, filePath=null]
特別注意:
- @Value不能將屬性值讀取靜態(tài)變量,否則讀取的值為空。
- @Value不能將屬性值讀取常量,否則讀取的值為空。
- @Value不能讀取boolean類型的值,經(jīng)過(guò)測(cè)試Spring Boot2.1的版本是無(wú)效的,2.2以上版本支持。
所以個(gè)人建議非必要情況,盡量少用@Value注解讀取屬性值。
@ConfigurationProperties
讀取配置文件值并且轉(zhuǎn)換成類對(duì)象,便于獲取值和修改屬性值。
示例代碼
application.yml文件中屬性:
http:
pool:
# 連接超時(shí)
connectTimeout: 5000
#獲取連接池中連接超時(shí)
connectionRequestTimeout: 1000
#每個(gè)路由連接數(shù)量
defaultMaxPerRoute: 50
# /連接池中最大連接數(shù)
maxTotal: 50
# 服務(wù)器返回?cái)?shù)據(jù)(response)的時(shí)間
socketTimeout: 5000
#定義不活動(dòng)的時(shí)間(以毫秒為單位),連接回收
validateAfterInactivity: 30000 @ConfigurationProperties讀取application.yml中以http.pool開頭的屬性值:
//以http.pool開頭
@Component
@ConfigurationProperties(prefix = "http.pool")
public class HttpClientConfig implements Serializable
{
private static final long serialVersionUID = -4608251658338406043L;
/**
* 最大連接數(shù)
*/
private Integer maxTotal;
/**
* 路由是對(duì)最大連接數(shù)的細(xì)分
* 每個(gè)路由基礎(chǔ)的連接數(shù)
*/
private Integer defaultMaxPerRoute;
/**
* 連接超時(shí)時(shí)間
*/
private Integer connectTimeout;
/**
* 從連接池中獲取連接的超時(shí)時(shí)間
*/
private Integer connectionRequestTimeout;
/**
* 服務(wù)器返回?cái)?shù)據(jù)(response)的時(shí)間
*/
private Integer socketTimeout;測(cè)試:
@GetMapping("getHttpClientConfig")
public void getHttpClientConfig()
{
String json=FastJsonUtil.toJSONString(httpClientConfig);
logger.info("fileConfig:{}",json);
}屬性嵌套:
@ConfigurationProperties 可以嵌套List、map、class
config:
url:http://localhsot:8080
gaode-map:
host: https://restapi.amap.com/v3
key: 1234
@ConfigurationProperties(prefix="config")
public class Config
{
//高德地圖信息
private GaodeMap gaodeMap;
}特別注意:
- 默認(rèn)情況不會(huì)將實(shí)體注入到spring的容器中,需要結(jié)合
@EnableConfigurationProperties或者@Component一起使用,否則注入對(duì)象為空。
@EnableConfigurationProperties
將@ConfigurationProperties讀取對(duì)象注入到spring容器中。例如上述示例也可以采用@EnableConfigurationProperties 來(lái)注入
@EnableConfigurationProperties(HttpClientConfig.class)
public class FileController
{
private Logger logger = LoggerFactory.getLogger(FileController.class);
@Autowired
private FileConfig fileConfig;
@GetMapping("getHttpClientConfig")
public void getHttpClientConfig()
{
String json=FastJsonUtil.toJSONString(httpClientConfig);
logger.info("fileConfig:{}",json);
}
}@ConfigurationPropertiesScan
用來(lái)掃描@ConfigurationProperties實(shí)體類并將類注入到Spring容器,上述示例可以如下使用
@ConfigurationPropertiesScan("com.xx.fw.config")
public class FwCoreApplication
{
public static void main(String[] args)
{
SpringApplication.run(FwCoreApplication.class, args);
}
}@PropertySource
@PropertySource 主要用于讀取指定的配置文件,需要結(jié)合@ConfigurationProperties 注解一起使用實(shí)現(xiàn)配置文件和Java Bean的注入操作。
示例代碼
屬性文件user.properteis:
user.id=222 user.name=劍圣 user.age=28
實(shí)體類定義:
@Component
@ConfigurationProperties(prefix = "user")
@PropertySource(value = {"classpath:user.properties"})
public class UserConfig
{
private String id;
private String name;
private int age;
}測(cè)試:
@GetMapping("getUserConfig")
public void getUserConfig()
{
String json=FastJsonUtil.toJSONString(userConfig);
logger.info("userConfig:{}",json);
}輸出結(jié)果:
c.s.fw.controller.FileController - userConfig:{"age":28,"id":"123","name":"admin"}總結(jié)
重點(diǎn)講解了通過(guò)各種注解讀取配置文件種屬性值,每種方式都是各自的優(yōu)缺點(diǎn),項(xiàng)目中一定要統(tǒng)一規(guī)范使用,便于項(xiàng)目維護(hù)和排查問(wèn)題。
到此這篇關(guān)于Spring Boot 如何正確讀取配置文件屬性的文章就介紹到這了,更多相關(guān)Spring Boot 讀取文件屬性內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
修改jar包package目錄結(jié)構(gòu)操作方法
這篇文章主要介紹了修改jar包package目錄結(jié)構(gòu)操作方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-07-07
Spring Core動(dòng)態(tài)代理的實(shí)現(xiàn)代碼
通過(guò)JDK的Proxy方式或者CGLIB方式生成代理對(duì)象的時(shí)候,相關(guān)的攔截器已經(jīng)配置到代理對(duì)象中去了,接下來(lái)通過(guò)本文給大家介紹Spring Core動(dòng)態(tài)代理的相關(guān)知識(shí),需要的朋友可以參考下2021-10-10
完美解決因數(shù)據(jù)庫(kù)一次查詢數(shù)據(jù)量過(guò)大導(dǎo)致的內(nèi)存溢出問(wèn)題
今天小編就為大家分享一篇完美解決因數(shù)據(jù)庫(kù)一次查詢數(shù)據(jù)量過(guò)大導(dǎo)致的內(nèi)存溢出問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06
druid執(zhí)行SQL出現(xiàn)錯(cuò)誤但不影響返回結(jié)果的問(wèn)題及解決
這篇文章主要介紹了druid執(zhí)行SQL出現(xiàn)錯(cuò)誤但不影響返回結(jié)果的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12
ScheduledExecutorService任務(wù)定時(shí)代碼示例
這篇文章主要介紹了ScheduledExecutorService任務(wù)定時(shí)代碼示例,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01
Java SpringMVC的@RequestMapping注解使用及說(shuō)明
這篇文章主要介紹了Java SpringMVC的@RequestMapping注解使用及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01

