SpringBoot的配置文件有yml和properties兩種,看一些文章說yml以數據爲中心,比較好。我的以爲properties更好用,因此這裏以properties格式爲例來講。springboot

咱們都知道@Value 註解能夠從配置文件讀取一個配置,若是隻是配置某個值,好比 某一個域名,配置爲xxx.domain = www.xxx.com ,這樣直接在代碼裏用@Value獲取,比較方便。app

可是若是是一組相關的配置,好比驗證碼相關的配置,有圖片驗證碼、手機驗證碼、郵箱驗證碼,若是想把驗證碼的長度作成可配置。是否能像springboot的配置,dom

參照着寫成:post

確定是能夠的!學習

參照源碼是最好的學習方式,下面來看springboot是怎麼作的this

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 類上使用了url

 @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);
    }
複製代碼