一、簡單的源碼分析
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
注解獲取到更友好的編程方式,同時這樣讓我們的配置更加模塊化。