javascript
springboot 读取配置文件_使用 @ConfigurationProperties 在 Spring Boot 中加载配置
使用 Spring Boot 加載配置文件的配置非常便利,我們只需要使用一些注解配置一下就能很方便地加載配置項了。今天我們談一談 ConfigurationProperties 注解的使用,ConfigurationProperties可以把配置文件中有相同前綴的配置在一個配置類中直接省去相同前綴進行讀取,甚至還可以將相同前綴的配置自動封裝成實體類。
步驟
創(chuàng)建標準 Spring Boot 工程
首先,我們使用一個標準的 Spring Boot 的依賴設置,在 build.gradle文件的plugins以及dependencies中加入相關內容,如下:
plugins {id 'org.springframework.boot' version '2.1.6.RELEASE'id 'java' }dependencies {implementation 'org.springframework.boot:spring-boot-starter'testImplementation 'org.springframework.boot:spring-boot-starter-test' }然后創(chuàng)建 Spring application 類,用于啟動我們的 Spring Boot 應用。(如果使用 IDEA 進行開發(fā),使用 New Project -> Spring Initializa 創(chuàng)建 Spring Boot 應用非常方便,IDEA 會幫我們自動生成 Spring application 類。)我們順便在Spring Application 類中加上一個 component,方便我們進行測試。(實現了CommandLineRunner的 component 會在應用啟動成功后運行)
@SpringBootApplication public class ConfigurationApplication {public static void main(String[] args) {SpringApplication.run(ConfigurationApplication.class, args);}@Componentclass StartupRunner implements CommandLineRunner {@Overridepublic void run(String... args) throws Exception {System.out.println("Application running");}} }編寫配置文件
Spring Boot 中默認的配置文件是 application.properties,但是我們通常會將自定義的配置單獨放在一個文件中,這里我們在 resources 目錄下創(chuàng)建一個配置文件 configprops.properties,并加入以下配置內容:
user.name=Tryking user.password=Security user.age=18可以看到,三個配置都有相同的前綴 user。
編寫配置讀取類
接下來我們編寫一個配置讀取的類文件
@Configuration @PropertySource("classpath:configprops.properties") @ConfigurationProperties(prefix = "user") public class ConfigProperties {private String name;private String password;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {...} }Configuration 注解表明我們需要一個配置 Bean,Spring 啟動的時候會在應用 Context 中幫我們創(chuàng)建一個 Java Bean。這里使用 Component 也是可以的,但是為了代碼的可讀性,我們使用 Configuration 更合理。
PropertySource 注解用來定義我們的配置文件位置,如果沒有此注解的話,Spring Boot 默認找的是 application.properties 文件。
ConfigurationProperties 注解便是我們的主角了,它用來定義我們要加載的配置的前綴,我們這里定義的是 user,因此 Spring Boot 會去尋找 user 前綴的配置。
在此類中,我們定義了三個屬性,分別是 name, password, age,和我們配置文件中的屬性是一一對應的。因為 Spring 使用標準的 Java Bean Setters,因此我們需要實現各個屬性的 getter & setter 方法。
這樣我們就完成了所有的配置,Spring 會自動將我們在配置文件中含有 user 前綴的配置綁定到 ConfigProperties 類中具有相同名字的屬性上。
測試配置成功與否
然后我們在 ConfigurationApplication 啟動類中定義的 StartupRunner component 中增加對此配置文件的測試,我們使用此配置的 toString() 方法進行輸出。
private final ConfigProperties configProperties;// 引入配置 bean @Autowired public ConfigurationApplication(ConfigProperties configProperties) {this.configProperties = configProperties; }public static void main(String[] args) {SpringApplication.run(ConfigurationApplication.class, args); }@Component class StartupRunner implements CommandLineRunner {@Overridepublic void run(String... args) throws Exception {System.out.println("Application running");// 輸出System.out.println(configProperties.toString());} }最后,我們啟動 Application,可以看到命令行中成功輸出了我們的配置信息。
Application running ConfigProperties{name='Tryking', password='Security', age=18}進階:加載嵌套屬性
我們還可以使用 ConfigurationProperties 來實現復雜對象的屬性加載,比如 Map,List,以及實體類。
我們在配置文件中繼續(xù)增加更多的配置:
# Simple properties user.name=Tryking user.password=Security user.age=18# List properties user.friends[0]=Tom user.friends[1]=Jack# Map properties user.scores.java=90 user.scores.python=95# Object properties user.job.address=Beijing user.job.salary=50000然后在配置讀取類中增加對這些屬性的讀取。
private String name; private String password; private int age; private List<String> friends; private Map<String, Integer> scores; private Job job;...set...同時不要忘記 getter & setter 方法的實現,以及實體 Bean Job的定義(同樣需要實現 getter & setter 方法)。
完成后,我們重新運行 Application,可以看到這些復雜配置也成功讀取出來了:
Application running ConfigProperties{name='Tryking', password='Security', age=18, friends=[Tom, Jack], scores={java=90, python=95}, job=Job{address='Beijing', salary=50000}}進階:在 @Bean 上使用 @ConfigurationProperties
我們還可以在具有 @Bean 注解的方法上使用 @ConfigurationProperties。
當我們想在我們引用的外部第三方 component 中綁定一些屬性時,此方法特別有用。
我們先創(chuàng)建一個簡單的 Item 供后面的類引用。
public class Item {private String name;private int size;// standard getters and setters }接下來,我們在 @Bean 注解上使用 @ConfigurationProperties,以綁定我們配置的屬性到此 Bean 上。
@Configuration public class ConfigProperties {@Bean@ConfigurationProperties(prefix = "item")public Item item() {return new Item();} }這樣,Spring Context 會將所有帶有 item 前綴的屬性幫我們映射到 Item 實例中。
配置驗證
@ConfigurationProperties 提供了屬性驗證的功能,使用 JSR-303 格式來進行驗證。支持驗證需要在類上增加@Validated注解,然后我們可以進行如下驗證:
- hostName 不允許為空
@NotBlank
private String hostName; - authMethod 屬性的長度為 1 - 3 個字符
@Length(max = 4, min = 1)
private String authMethod; - port 屬性的取值從 1025 到 65536
@Min(1025)
@Max(65536)
private int port; - from 屬性必須滿足 Email 格式
@Pattern(regexp = "^[a-z0-9._%+-]+@[a-z0-9.-]+.[a-z]{2,6}$")
private String from;
通過這種方式我們就可以驗證屬性是否合規(guī),而不用使用一系列的 if 、else 來進行驗證了。
如果有驗證無法通過,那么我們啟動應用的時候 Application 將啟動失敗,并且拋出一個IllegalStateException異常。
相關代碼
Spring Boot Configuration
總結
以上是生活随笔為你收集整理的springboot 读取配置文件_使用 @ConfigurationProperties 在 Spring Boot 中加载配置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: redis序列化_scrapy_redi
- 下一篇: jsp调用controller方法_Sp