SpringBoot用@ConfigurationProperties獲取配置檔案值
SpringBoot的配置檔案有yml和properties兩種,看一些文章說yml以資料為中心,比較好。個人覺得properties更好用,所以這裡以properties格式為例來說。
我們都知道@Value 註解可以從配置檔案讀取一個配置,如果只是配置某個值,比如 某一個域名,配置為xxx.domain = www.xxx.com ,這樣直接在程式碼裡用@Value獲取,比較方便。
但是如果是一組相關的配置,比如驗證碼相關的配置,有圖片驗證碼、手機驗證碼、郵箱驗證碼,如果想把驗證碼的長度做成可配置。是否能像springboot的配置,
參照著寫成:
肯定是可以的!
參照原始碼是最好的學習方式,下面來看springboot是怎麼做的
server對應著一個配置類:ServerProperties(只粘貼出了部分成員變數,來說明問題)
@ConfigurationProperties(prefix = "server", ignoreUnknownFields = true) public class ServerProperties implements EmbeddedServletContainerCustomizer, EnvironmentAware, Ordered { /** * Server HTTP port.*/ private Integer port; @NestedConfigurationProperty private Compression compression = new Compression(); //省略其他成員變數、getter 、setter
Compression類部分程式碼:
public class Compression {
/**
* If response compression is enabled.
*/
private boolean enabled = false;
看過後應該很明白了,之所以能寫成server.port=8081,server.display-name=lhyapp,server.compression.enabled=true ,是因為 ServerProperties 類上使用了
@ConfigurationProperties(prefix = "server", ignoreUnknownFields = true) 註解,其中prefix 指定配置檔案裡的字首, 如果想弄成這樣式的 server.compression.enabled = true ,就需要再聲名一個類 Compression ,然後在ServerProperties 中引用這個類,屬性名對應配置檔案中的配置名。
@ConfigurationProperties:
告訴SpringBoot將本類中的所有屬性和配置檔案中相關的配置進行繫結;
prefix = "xxx":配置檔案中哪個下面的所有屬性進行一一對映
只有這個元件是容器中的元件,才能容器提供的@ConfigurationProperties功能;
@ConfigurationProperties(prefix = "xxx")預設從全域性配置檔案中獲取值;
下邊實現上面說的驗證碼配置,需要的類:
程式碼:
CoreConfiguration.java
@Configuration @EnableConfigurationProperties(SecurityProperties.class) public class CoreConfiguration { //配置一些bean //@Bean //public XXXX xxxx(){} }
SecurityProperties.java
@ConfigurationProperties(prefix = "myapp") public class SecurityProperties { private ValidateCodeProperties code = new ValidateCodeProperties(); public ValidateCodeProperties getCode() { return code; } public void setCode(ValidateCodeProperties code) { this.code = code; } }
ValidateCodeProperties.java
public class ValidateCodeProperties { private SmsCodeProperties sms = new SmsCodeProperties(); private ImageCodeProperties image = new ImageCodeProperties(); public SmsCodeProperties getSms() { return sms; } public void setSms(SmsCodeProperties sms) { this.sms = sms; } public ImageCodeProperties getImage() { return image; } public void setImage(ImageCodeProperties image) { this.image = image; } }
SmsCodeProperties.java
public class SmsCodeProperties { private int length = 4; public int getLength() { return length; } public void setLength(int length) { this.length = length; } }
在application.properties 裡配置
myapp.code.sms.length = 10
使用配置:
@Autowired private SecurityProperties securityProperties; @RequestMapping("/length") public @ResponseBody String length(){ int length = securityProperties.getCode().getSms().getLength(); return String.valueOf(length); }