javascript
springboot 读取配置文件_使用 @ConfigurationProperties 在 Spring Boot 中加载配置
使用 Spring Boot 加載配置文件的配置非常便利,我們只需要使用一些注解配置一下就能很方便地加載配置項(xiàng)了。今天我們談一談 ConfigurationProperties 注解的使用,ConfigurationProperties可以把配置文件中有相同前綴的配置在一個(gè)配置類中直接省去相同前綴進(jìn)行讀取,甚至還可以將相同前綴的配置自動(dòng)封裝成實(shí)體類。
步驟
創(chuàng)建標(biāo)準(zhǔn) Spring Boot 工程
首先,我們使用一個(gè)標(biāo)準(zhǔn)的 Spring Boot 的依賴設(shè)置,在 build.gradle文件的plugins以及dependencies中加入相關(guān)內(nèi)容,如下:
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 類,用于啟動(dòng)我們的 Spring Boot 應(yīng)用。(如果使用 IDEA 進(jìn)行開(kāi)發(fā),使用 New Project -> Spring Initializa 創(chuàng)建 Spring Boot 應(yīng)用非常方便,IDEA 會(huì)幫我們自動(dòng)生成 Spring application 類。)我們順便在Spring Application 類中加上一個(gè) component,方便我們進(jìn)行測(cè)試。(實(shí)現(xiàn)了CommandLineRunner的 component 會(huì)在應(yīng)用啟動(dòng)成功后運(yùn)行)
@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");}} }編寫(xiě)配置文件
Spring Boot 中默認(rèn)的配置文件是 application.properties,但是我們通常會(huì)將自定義的配置單獨(dú)放在一個(gè)文件中,這里我們?cè)?resources 目錄下創(chuàng)建一個(gè)配置文件 configprops.properties,并加入以下配置內(nèi)容:
user.name=Tryking user.password=Security user.age=18可以看到,三個(gè)配置都有相同的前綴 user。
編寫(xiě)配置讀取類
接下來(lái)我們編寫(xiě)一個(gè)配置讀取的類文件
@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 注解表明我們需要一個(gè)配置 Bean,Spring 啟動(dòng)的時(shí)候會(huì)在應(yīng)用 Context 中幫我們創(chuàng)建一個(gè) Java Bean。這里使用 Component 也是可以的,但是為了代碼的可讀性,我們使用 Configuration 更合理。
PropertySource 注解用來(lái)定義我們的配置文件位置,如果沒(méi)有此注解的話,Spring Boot 默認(rèn)找的是 application.properties 文件。
ConfigurationProperties 注解便是我們的主角了,它用來(lái)定義我們要加載的配置的前綴,我們這里定義的是 user,因此 Spring Boot 會(huì)去尋找 user 前綴的配置。
在此類中,我們定義了三個(gè)屬性,分別是 name, password, age,和我們配置文件中的屬性是一一對(duì)應(yīng)的。因?yàn)?Spring 使用標(biāo)準(zhǔn)的 Java Bean Setters,因此我們需要實(shí)現(xiàn)各個(gè)屬性的 getter & setter 方法。
這樣我們就完成了所有的配置,Spring 會(huì)自動(dòng)將我們?cè)谂渲梦募泻?user 前綴的配置綁定到 ConfigProperties 類中具有相同名字的屬性上。
測(cè)試配置成功與否
然后我們?cè)?ConfigurationApplication 啟動(dòng)類中定義的 StartupRunner component 中增加對(duì)此配置文件的測(cè)試,我們使用此配置的 toString() 方法進(jìn)行輸出。
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());} }最后,我們啟動(dòng) Application,可以看到命令行中成功輸出了我們的配置信息。
Application running ConfigProperties{name='Tryking', password='Security', age=18}進(jìn)階:加載嵌套屬性
我們還可以使用 ConfigurationProperties 來(lái)實(shí)現(xiàn)復(fù)雜對(duì)象的屬性加載,比如 Map,List,以及實(shí)體類。
我們?cè)谂渲梦募欣^續(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然后在配置讀取類中增加對(duì)這些屬性的讀取。
private String name; private String password; private int age; private List<String> friends; private Map<String, Integer> scores; private Job job;...set...同時(shí)不要忘記 getter & setter 方法的實(shí)現(xiàn),以及實(shí)體 Bean Job的定義(同樣需要實(shí)現(xiàn) getter & setter 方法)。
完成后,我們重新運(yùn)行 Application,可以看到這些復(fù)雜配置也成功讀取出來(lái)了:
Application running ConfigProperties{name='Tryking', password='Security', age=18, friends=[Tom, Jack], scores={java=90, python=95}, job=Job{address='Beijing', salary=50000}}進(jìn)階:在 @Bean 上使用 @ConfigurationProperties
我們還可以在具有 @Bean 注解的方法上使用 @ConfigurationProperties。
當(dāng)我們想在我們引用的外部第三方 component 中綁定一些屬性時(shí),此方法特別有用。
我們先創(chuàng)建一個(gè)簡(jiǎn)單的 Item 供后面的類引用。
public class Item {private String name;private int size;// standard getters and setters }接下來(lái),我們?cè)?@Bean 注解上使用 @ConfigurationProperties,以綁定我們配置的屬性到此 Bean 上。
@Configuration public class ConfigProperties {@Bean@ConfigurationProperties(prefix = "item")public Item item() {return new Item();} }這樣,Spring Context 會(huì)將所有帶有 item 前綴的屬性幫我們映射到 Item 實(shí)例中。
配置驗(yàn)證
@ConfigurationProperties 提供了屬性驗(yàn)證的功能,使用 JSR-303 格式來(lái)進(jìn)行驗(yàn)證。支持驗(yàn)證需要在類上增加@Validated注解,然后我們可以進(jìn)行如下驗(yàn)證:
- hostName 不允許為空
@NotBlank
private String hostName; - authMethod 屬性的長(zhǎng)度為 1 - 3 個(gè)字符
@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ò)這種方式我們就可以驗(yàn)證屬性是否合規(guī),而不用使用一系列的 if 、else 來(lái)進(jìn)行驗(yàn)證了。
如果有驗(yàn)證無(wú)法通過(guò),那么我們啟動(dòng)應(yīng)用的時(shí)候 Application 將啟動(dòng)失敗,并且拋出一個(gè)IllegalStateException異常。
相關(guān)代碼
Spring Boot Configuration
總結(jié)
以上是生活随笔為你收集整理的springboot 读取配置文件_使用 @ConfigurationProperties 在 Spring Boot 中加载配置的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: redis序列化_scrapy_redi
- 下一篇: udp本地通信需要注意哪些方面_验房注意