SpringBoot?常用讀取配置文件的三種方法詳解
我們在SpringBoot框架進行項目開發(fā)中該如何優(yōu)雅的讀取配置呢?或者說對于一些List或者Map應該如何配置呢?
本篇主要解決如下幾個問題:
1、Spring Boot有哪些常用的讀取配置文件方式?
1)使用 @Value 讀取配置文件
2) 使用 @ConfigurationProperties 讀取配置文件
3)使用 Environment 讀取配置文件
2、一些復雜的數(shù)據(jù)結構,如List、Map,如何配置?如何讀取呢?
前言
Spring Boot默認的配置文件有兩種格式: application.properties 和 application.yml。 查找順序是首先從application.properties 查找,
如果找不到,再查找 application.yml。優(yōu)先級:application.properties > application.yml。
以yml中rabbitmq的配置為例,配置文件如下:
rabbitmq: host: 127.0.0.1 password: root port: 5672 username: root
一、使用 @Value 讀取配置文件
這種方法適用于對象的參數(shù)比較少的情況
我們可以直接在對象的屬性上使用 @Value 注解,同時以 ${} 的形式傳入配置文件中對應的屬性。同時需要在該類的上方使用 @Configuration 注解,將該類作為配置
文件加入,在啟動項目的時候實現(xiàn)注入。
@Configuration
public class RabbitmqProperties {
@Value("${rabbitmq.host}")
private String rabbitmqHost;
@Value("${rabbitmq.port}")
private String rabbitmqPort;
@Value("${rabbitmq.username}")
private String rabbitmqUsername;
@Value("${rabbitmq.password}")
private String rabbitmqPassword;
}
如果哪里需要用到,通過 @Autowired 注入進去就可以獲取屬性值了
@Component
public class PropertiesTest {
@Autowired
private RabbitmqProperties rabbitmqProperties;
}
二、使用 @ConfigurationProperties 讀取配置文件
如果對象的參數(shù)比較多情況下,推薦使用 @ConfigurationProperties 會更簡單一些,不需要在每一個字段的上面的使用@Value注解。
@ConfigurationProperties注解聲明當前類為配置讀取類
prefix="rabbitmq" 表示讀取前綴為rabbitmq的屬性
示例如下:
@ConfigurationProperties(prefix = "rabbitmq")
public class RabbitmqProperties {
private String host;
private String port;
private String username;
private String password;
}
這里有一點需要注意: 必須保證屬性名稱和字段一模一樣,且類需要提供字段的setter方法
注意 如果僅僅只是使用了 @ConfigurationProperties 注解是沒有效果的,它并不會將這個配置注入容器中,它還需要和注入容器的注解一起使用。
這里有兩種方法實現(xiàn)將它注入到容器中
1、類上添加@Configuration注解
除了@Configuration,也可以是@Controller、@RestController、@Service、@Componet等注解,加入到Ioc容器里。
@Setter
@Configuration
@ConfigurationProperties(prefix = "rabbitmq")
public class RabbitmqProperties {
private String host;
private String port;
private String username;
private String password;
}
同樣哪里需要用到,通過 @Autowired 注入進去就可以獲取屬性值了
2、使用@EnableConfigurationProperties注解
通過 @EnableConfigurationProperties 注解可以將指定的配置讀取類的對象加載到Spring容器,也就是說,在其他配置類上使用一個@EnableConfigurationProperties注解,
來將配置文件的參數(shù)和RabbitmqProperties類的屬性綁定。這樣就不需要在RabbitmqProperties類上使用@Configuration注解了
@Configuration
@EnableConfigurationProperties(RabbitmqProperties.class)
public class RabbitmqConfig {
@Autowired
private RabbitmqProperties prop;
@Bean
public Rabbitmq rabbitmq() {
Rabbitmq mq = new Rabbitmq();
mq.setHost(prop.getHost());
mq.setPort(prop.getPort());
mq.setUsername(prop.getUsername());
mq.setPassword(prop.getPassword());
return mq;
}
}
3、使用@ConfigurationPropertiesScan掃描
在 Spring Boot 2.2.0.RELEASE 中提供了一個掃描注解@ConfigurationPropertiesScan。它可以掃描特定包下所有的被@ConfigurationProperties標記的配置類,
并將它們進行IoC注入。
@ConfigurationPropertiesScan
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
SpringApplication.run(MainApplication.class, args);
}
}
三、使用 Environment 讀取配置文件
Environment 是 SpringCore 中的一個用于讀取配置文件的類,將此類使用 @Autowired 注入到類中就可以使用它的getProperty方法來獲取某個配置項的值。
如下代碼所示:
@SpringBootApplication
public class MainApplication implements InitializingBean {
@Autowired
private Environment environment;
public static void main(String[] args) {
SpringApplication.run(MainApplication.class, args);
}
@Override
public void afterPropertiesSet() {
String username = environment.getProperty("rabbitmq.username");
System.out.println("rabbitmq當前用戶名為: " + username);
}
}
四、常用的幾種數(shù)據(jù)結構配置讀取
比如我們常見的字符串、整數(shù)、List、Map如何配置和讀取呢?這里以之前自己開發(fā)的一個項目中用到復雜的配置數(shù)據(jù)來做示例之前有發(fā)布一個基于
Spring Cache實現(xiàn)二級緩存(Caffeine+Redis) 的項目,里面的配置就比較復雜。
具體項目地址:基于Spring Cache實現(xiàn)Caffeine+Redis二級緩存
這里展示配置示例:
application.yml
# 二級緩存配置
l2cache:
config:
# 是否存儲空值,默認true,防止緩存穿透
allowNullValues: true
# 組合緩存配置
composite:
# 是否全部啟用一級緩存,默認false
l1AllOpen: false
# 是否手動啟用一級緩存,默認false
l1Manual: true
# 手動配置走一級緩存的緩存key集合,針對單個key維度
l1ManualKeySet:
- userCache:user01
- userCache:user02
- userCache:user03
- userCache:user04
# 一級緩存
caffeine:
# 緩存刷新調(diào)度線程池的大小
refreshPoolSize: 2
# 寫入后過期時間(秒)
expireAfterWrite: 180
# 訪問后過期時間(秒)
expireAfterAccess: 180
# 初始化大小
initialCapacity: 100
# 最大緩存對象個數(shù),超過此數(shù)量時之前放入的緩存將失效
maximumSize: 300
# 二級緩存
redis:
# 全局過期時間,單位毫秒,默認不過期
defaultExpiration: 300000
# 每個cacheName的過期時間,單位毫秒
expires: {userCache: 300000,goodsCache: 50000}
# 緩存更新時通知其他節(jié)點的topic名稱 默認 cache:redis:caffeine:topic
topic: cache:redis:caffeine:topic
配置實體類
@Data
@ConfigurationProperties(prefix = "l2cache")
public class L2CacheProperties {
/**
* 緩存配置
*/
private L2CacheConfig config;
}
L2CacheConfig
/**
* 緩存配置
*
* @author xub
* @date 2022/9/20 下午6:02
*/
@Data
public class L2CacheConfig {
/** 是否存儲空值,設置為true時,可防止緩存穿透 */
private boolean allowNullValues = true;
/** 組合緩存配置 */
private final Composite composite = new Composite();
/** 一級緩存配置 */
private final Caffeine caffeine = new Caffeine();
/** 二級緩存配置 */
private final Redis redis = new Redis();
/**
* 組合緩存配置
*/
@Data
public static class Composite {
/** 是否全部啟用一級緩存,默認false*/
private boolean l1AllOpen = false;
/** 是否手動啟用一級緩存,默認false */
private boolean l1Manual = false;
/** 手動配置走一級緩存的緩存key集合,針對單個key維度*/
private Set<String> l1ManualKeySet = new HashSet<>();
}
/**
* 一級緩存配置
*/
@Data
public static class Caffeine {
/** 緩存刷新調(diào)度線程池的大小 默認為 CPU數(shù) * 2 */
private Integer refreshPoolSize = Runtime.getRuntime().availableProcessors();
/** 寫入后過期時間,單位秒 */
private long expireAfterWrite;
/** 寫入后刷新時間,單位秒 */
private long refreshAfterWrite;
/** 初始化大小 */
private int initialCapacity;
/** 最大緩存對象個數(shù),超過此數(shù)量時之前放入的緩存將失效 */
private long maximumSize;
}
/**
* 二級緩存配置
*/
@Data
public static class Redis {
/** 全局過期時間,單位毫秒,默認不過期 */
private long defaultExpiration = 0;
/** 每個cacheName的過期時間,單位毫秒,優(yōu)先級比defaultExpiration高 */
private Map<String, Long> expires = new HashMap<>();
/** 緩存更新時通知其他節(jié)點的topic名稱 */
private String topic = "cache:redis:caffeine:topic";
}
}
Configuration類
@Configuration
@EnableConfigurationProperties(L2CacheProperties.class)
public class CacheRedisCaffeineAutoConfiguration {
@Autowired
private L2CacheProperties l2CacheProperties;
@Bean
public RedisCaffeineCacheManager cacheManager() {
return new RedisCaffeineCacheManager(l2CacheProperties.getConfig());
}
}
測試
項目啟動后,進行Debug打斷點,看有木有注入到L2CacheProperties實體中

通過上面截圖就可以看出,所有application.yml配置數(shù)據(jù),都已經(jīng)在L2CacheProperties實體中,說明配置成功,獲取也成功了。
到此這篇關于SpringBoot 常用讀取配置文件的 3 種方法! 的文章就介紹到這了,更多相關SpringBoot 讀取配置文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Springboot整合redis實現(xiàn)發(fā)布訂閱功能介紹步驟
發(fā)布訂閱作為一種設計思想在很多開源組件中都有體現(xiàn),比如大家熟知的消息中間件等,可謂把發(fā)布訂閱這一思想體現(xiàn)的淋漓盡致了2022-09-09
Spring Boot實現(xiàn)異步請求(Servlet 3.0)
在spring 3.2 及以后版本中增加了對請求的異步處理,這篇文章主要介紹了Spring Boot實現(xiàn)異步請求(Servlet 3.0),感興趣的小伙伴們可以參考一下。2017-04-04
簡單解析java方法在調(diào)用在內(nèi)存中的執(zhí)行過程
這篇文章主要介紹了簡單解析java方法在調(diào)用在內(nèi)存中的執(zhí)行過程,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-07-07
java數(shù)字圖像處理基礎使用imageio寫圖像文件示例
這篇文章主要介紹了Java 2D的圖像處理API,文章討論和提及的API都是基于JDK6的,Java中寫一個圖像文件使用ImageIO對象即可,下面看代碼吧2014-01-01

