SpringBoot?常用讀取配置文件的三種方法詳解
我們在SpringBoot框架進行項目開發(fā)中該如何優(yōu)雅的讀取配置呢?或者說對于一些List或者Map應(yīng)該如何配置呢?
本篇主要解決如下幾個問題:
1、Spring Boot有哪些常用的讀取配置文件方式?
1)使用 @Value
讀取配置文件
2) 使用 @ConfigurationProperties
讀取配置文件
3)使用 Environment
讀取配置文件
2、一些復雜的數(shù)據(jù)結(jié)構(gòu),如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
注解,同時以 ${}
的形式傳入配置文件中對應(yīng)的屬性。同時需要在該類的上方使用 @Configuration
注解,將該類作為配置
文件加入,在啟動項目的時候?qū)崿F(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ù)結(jié)構(gòu)配置讀取
比如我們常見的字符串、整數(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 { /** 是否存儲空值,設(shè)置為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實體中,說明配置成功,獲取也成功了。
到此這篇關(guān)于SpringBoot 常用讀取配置文件的 3 種方法! 的文章就介紹到這了,更多相關(guān)SpringBoot 讀取配置文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于JVM垃圾回收的java.lang.ref.Finalizer問題
這篇文章主要介紹了關(guān)于JVM垃圾回收的java.lang.ref.Finalizer問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05JDBC連接SQL?Server數(shù)據(jù)庫實現(xiàn)增刪改查的全過程
實際開發(fā)中手動的輸入SQL語句是少之又少,大多數(shù)情況下是通過編譯代碼進行來控制自動執(zhí)行,下面這篇文章主要給大家介紹了關(guān)于JDBC連接SQL?Server數(shù)據(jù)庫實現(xiàn)增刪改查的相關(guān)資料,需要的朋友可以參考下2023-04-04你必須得會的SpringBoot全局統(tǒng)一處理異常詳解
程序在運行的過程中,不可避免會產(chǎn)生各種各樣的錯誤,這個時候就需要進行異常處理,本文主要為大家介紹了SpringBoot實現(xiàn)全局統(tǒng)一處理異常的方法,需要的可以參考一下2023-06-06win10操作系統(tǒng)下重啟電腦java環(huán)境變量失效
這篇文章主要介紹了win10操作系統(tǒng)下重啟電腦java環(huán)境變量失效,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-09-09