網站首頁 編程語言 正文
文章目錄
- 背景
- 獲取配置方式
- 方式一:@Value注解
- 方式二:@ConfigurationProperties注解(建議)
- 方式三:Environment接口
- 自定義配置文件laker.properties
- 自定義配置文件laker.yml
- IDEA自動提示功能
- 1.添加依賴
- 2.添加配置類
- 3.在application.yml中測試自動提示
- 原理
- 配置優先級
背景
日常開發中,經常會使用到自定義配置,例如在常用的application.yml
中增加配置,在命令行
中進行配置覆蓋,以及外部的自定義xxx.properties
等。
- 如果是工程管理的配置,IDEA會自動提示框架的相關配置,防止我們寫錯配置項。
- 我們也常使用自定義外部文件配置,用來管理一些項目中重要的秘鑰、證書等。
獲取配置方式
假設在application.yml
或者application.properties
存在自定義配置。
laker:
username: laker
方式一:@Value注解
@Component
public class LakerBean {
@Value("${laker.username}")
private String username;
}
方式二:@ConfigurationProperties注解(建議)
@Configuration //將該Bean放入spring容器中
@Data
@ConfigurationProperties(prefix = "laker") // 指定前綴
public class TestConfig {
private String username;
private String password;
}
@Component
public class LakerBean {
@Autowired
TestConfig testConfig ;
}
方式三:Environment接口
@Component
public class LakerBean {
@Autowired
Environment env;
...
env.getProperty("laker.username")
}
大部分場景我們建議使用@
ConfigurationProperties
注解方式獲取配置。
自定義配置文件laker.properties
除了默認的application.yml
配置文件,還支持自定義配置文件。例如新建個laker.properties
laker.username=laker
laker.password=123
我們使用的是@PropertySource
注解。
注意:
- 只支持properties和xml格式文件,不支持yml格式
- 支持
classpath
和file
,classpath:app.properties
orfile:/path/to/file.xml
.
@Data
@Configuration
@ConfigurationProperties(prefix = "laker", ignoreUnknownFields = true)
@PropertySource("classpath:laker.properties")//指定配置文件位置
public class TestConfig {
private String username;
private String password;
}
自定義配置文件laker.yml
如果想自定義支持yml格式,只需要增加個自定義PropertySourcesPlaceholderConfigurer
如下。
@Configuration
public class LakerYml {
@Bean
public static PropertySourcesPlaceholderConfigurer loadYaml(){
PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
//yaml.setResources(new FileUrlResource("/config/laker.yml"));
yaml.setResources(new ClassPathResource("laker.yml"));
configurer.setProperties(Objects.requireNonNull(yaml.getObject()));
return configurer;
}
}
其他同上面的laker.properties
,@PropertySource("classpath:laker.yml")
,指定配置文件位置.
laker.yml
laker:
username: laker
IDEA自動提示功能
非常重要,如果沒有這個自動提示,那么很容易寫錯配置項。
1.添加依賴
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-configuration-processorartifactId>
<optional>trueoptional>
dependency>
2.添加配置類
@Configuration //將該Bean放入spring容器中
@Data
@ConfigurationProperties(prefix = "laker") // 指定前綴
public class TestConfig {
/**
* 用戶名
*/
private String username;
/**
* 密碼
*/
private String password;
}
3.在application.yml中測試自動提示
注意:要重新編譯項目,會在
target\classes\META-INF
目錄生成spring-configuration-metadata.json
文件。
我們在application.yml中輸入laker效果如下:
注意:對于上面我們自定義的laker.yml
,默認是沒有提示的,我們需要把自定義配置文件加入到SpringBoot工程環境即可。
選擇項目結構,把自定義文件加入到config files中,然后保存-應用。
原理
以下內容來自:https://blog.csdn.net/u013202238/article/details/117407129
依賴spring-boot-configuration-processor,其作用能夠解析我們的配置類,生成spring-configuration-metadata.json文件。
-
掃描以
@ConfigurationProperties
注解的類 -
如果我們不添加該依賴,按照同樣的格式、文件名稱手寫編寫這個json文件,也可以實現提示功能。
-
SpringBoot給我們規定了名為additional-spring-configuration-metadata.json的文件,便于我們手動編寫一些特殊的配置項,在生成json文件里面的內容時,會將additional-spring-configuration-metadata.json里面的內容追加到spring-configuration-metadata.json
SpringBoot只是給出了json格式的配置文件,由Idea插件讀取該文件實現提示,而且只有idea Ultimate版本才會有這個功能,Community社區版本無法提示。當然eclipse中也有插件可以來實現配置項的自動提示。
spring-boot-configuration-processor工作原理
在自動生成配置提示的json文件時,最后一步就是編譯項目。就是為了讓spring-boot-configuration-processor執行,其實就是利用了java的編譯時期的spi擴展機制。javax.annotation.processing.Processor(注解處理器)
注解處理器(Annotation Processor)是javac內置的一個用于編譯時掃描和處理注解(Annotation)的工具,在程序編譯階段工作,所以我們可以在編譯期間通過注解處理器進行我們需要的操作。
比較常用的用法就是在編譯期間獲取相關注解數據,然后動態生成.java源文件(讓機器幫我們寫代碼),通常是自動產生一些有規律性的重復代碼,解決了手工編寫重復代碼的問題,大大提升編碼效率。
實際上我們常用的Lombok這個jar,通過@Getter/@Setter生成字段的getter/setter方法也是利用了同樣的原理.
配置優先級
Spring Boot能從多種屬性源獲得屬性,包括
- 命令行參數(–server.port=9000)
-
java:comp/env
里的JNDI
屬性 - Java 系統屬性(System.getProperties())
- 操作系統環境變量
- RandomValuePropertySource 配置的 random.* 屬性值
- 配置文件(application-{profile}.properties和YAML變體)
- 配置文件(YAML 文件、Properties 文件)
- 通過@PropertySource標注的屬性源
- 默認屬性
這個列表按照優先級排序,也就是說,任何在高優先級屬性源里設置的屬性都會覆蓋低優先級的相同屬性。例如,命令行參數會覆蓋其他屬性源里的屬性。
配置文件(YAML 文件、Properties 文件)說明
SpringBoot啟動會掃描以下位置的application.properties/yml
文件作為spring boot的默認配置文件:
file:./config/
file:./
classpath:/config/
classpath:/
- 外置,在相對于應用程序運行目錄的/config子目錄里。
- 外置,在應用程序運行的目錄里。
- 內置,在config包內。
- 內置,在Classpath根目錄。
同樣,這個列表按照優先級排序。也就是說,/config子目錄
里的application.properties
會覆蓋應用程序Classpath里的application.properties
中的相同屬性。
此外,如果你在同一優先級位置同時有application.properties和application.yml,那么application.yml里的屬性會覆蓋application.properties里的屬性
yml > yaml > properties
以上只列了常用的外部配置,具體請參考SpringBoot官方文檔。
參考:
-
https://blog.csdn.net/u013202238/article/details/117407129
-
https://docs.spring.io/spring-boot/docs/2.4.5/reference/html/appendix-configuration-metadata.html#configuration-metadata-providing-manual-hints
-
https://docs.spring.io/spring-boot/docs/2.4.5/reference/html/spring-boot-features.html#boot-features-external-config
原文鏈接:https://blog.csdn.net/abu935009066/article/details/124905781
相關推薦
- 2022-01-13 出現/usr/lib64/erlang/erts-10.3/bin/beam.smp: error
- 2022-09-16 JQuery實現電梯導航效果_jquery
- 2022-04-21 Python?數據類型--集合set_python
- 2022-04-16 python中defaultdict字典功能特性介紹_python
- 2022-04-24 基于Python制作一個文件去重小工具_python
- 2023-06-18 聚星C#數字信號處理工具包頻譜分析的用法_C#教程
- 2022-04-02 Docker中Dockerfile制作鏡像的方法步驟_docker
- 2022-03-29 python進階之魔術方法詳解_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支