springBoot常用注解之@ConfigurationProperties


一、簡單的源碼分析

Spring源碼中大量使用了ConfigurationProperties注解,比如server.port就是由該注解獲取到的,通過與其他注解配合使用,能夠實現Bean的按需配置。

該注解有一個prefix屬性,通過指定的前綴,綁定配置文件中的配置,通過如下源碼可以看出,該注解可以放在類上,也可以放在方法上。

 

二、@ConfigurationProperties使用的注意事項

1.  前綴定義了哪些外部屬性將綁定到類的字段上;

2. 根據 Spring Boot 寬松的綁定規則,類的屬性名稱必須與外部屬性的名稱匹配;

    Spring 寬松綁定規則 (relaxed binding,Spring使用一些寬松的綁定屬性規則。因此,以下變體都將綁定到 hostName 屬性上:
    hostName、hostname、host-name、host_name、HOST_NAME等。

3. 我們可以簡單地用一個值初始化一個字段來定義一個默認值;

4. 類本身可以是包私有的;

5. 類的字段必須有公共 setter 方法;

三、實例應用

@ConfigurationProperties的使用有兩種方式。

配置文件內容,這里用的是*.poperties做的案例,實際使用中組好使用*.yml文件。

spring.datasource.url=jdbc:mysql://127.0.0.1:8888/test?useUnicode=false&autoReconnect=true&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

第一種是作用類上:如下

java代碼:

@ConfigurationProperties(prefix = "spring.datasource")
@Component
public class DatasourcePro {

    private String url;

    private String username;

    private String password;

    // 配置文件中是driver-class-name, 轉駝峰命名便可以綁定成
    private String driverClassName;

    private String type;

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getDriverClassName() {
        return driverClassName;
    }

    public void setDriverClassName(String driverClassName) {
        this.driverClassName = driverClassName;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }
}

controller中的使用:

@Controller
@RequestMapping(value = "/config")
public class ConfigurationPropertiesController {

    @Autowired
    private DatasourcePro datasourcePro;

    @RequestMapping("/test")
    @ResponseBody
    public Map<String, Object> test(){

        Map<String, Object> map = new HashMap<>();
        map.put("url", datasourcePro.getUrl());
        map.put("userName", datasourcePro.getUsername());
        map.put("password", datasourcePro.getPassword());
        map.put("className", datasourcePro.getDriverClassName());
        map.put("type", datasourcePro.getType());

        return map;
    }
}

第二種作用與方法上:

java POJO:

public class Datasource {

    private String url;

    private String username;

    private String password;

    // 配置文件中是driver-class-name, 轉駝峰命名便可以綁定成
    private String driverClassName;

    private String type;

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getDriverClassName() {
        return driverClassName;
    }

    public void setDriverClassName(String driverClassName) {
        this.driverClassName = driverClassName;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }
}

配置類上:

@Configuration
public class DruidDataSourceConfig {
    /**
     * DataSource 配置
     * @return
     */
    @ConfigurationProperties(prefix = "spring.datasource.druid.read")
    @Bean(name = "readDruidDataSource")
    public DataSource readDruidDataSource() {
        return new DruidDataSource();
    }
}

四、拓展

 

 

 1. 通過源碼可以看大有 ignoreInvalidFields和ignoreUnknownFields兩個屬性。其中

    ignoreInvalidFields:表示是文件*.yml提供了DataSource類無法轉換的屬性,默認情況下,Spring Boot 將會啟動失敗,並拋出異常:

    ignoreUnknownFields:表示文件*.yml提供了DataSource類無法識別的屬性;

2. 啟動時校驗 @ConfigurationProperties、Duration、DataSize、Deprecated(@DeprecatedConfigurationProperty)。

詳情可參考https://blog.csdn.net/yusimiao/article/details/97622666博客

 總結:

1. @ConfigurationProperties 和 @value 有着相同的功能,但是 @ConfigurationProperties的寫法更為方便

2. Spring Boot 的 @ConfigurationProperties 注解在綁定類型安全的 Java Bean 時是非常強大的,我們可以配合其注解屬性和

 @DeprecatedConfigurationProperty 注解獲取到更友好的編程方式,同時這樣讓我們的配置更加模塊化。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM