註解@ConfigurationProperties使用方法
前言
最近在思考使用java config的方式進行配置,java config是指基於java配置的spring。傳統的Spring通常都是基本xml配置的,後來spring3.0新增了許多java config的註解,特別是spring boot,基本都是清一色的java config。java
Spring配置方式
第一階段:xml配置 在spring 1.x時代,使用spring開發滿眼都是xml配置的bean,隨着項目的擴大, 咱們須要把xml配置文件分放到不一樣的配置文件中,那時候須要頻繁地在開發的類和配置文件間切換。mysql
第二階段:註解配置
在spring 2.x時代,隨着JDK1.5帶來的註解支持,spring提供了聲明bean的註解, 大大減小了配置量。這時spring圈子存在一種爭論:註解配置和xml配置究竟哪一個更好?咱們最終的選擇是應用 的基本配置用xml,業務配置用戶註解。spring
第三階段:Java配置(java config)
從spring 3.x到如今,spring提供了Java配置的能力,使用Java配置更好的理解 配置的bean。spring 4.x和spring boot都推薦使用Java配置。sql
Spring IOC有一個很是核心的概念——Bean。由Spring容器來負責對Bean的實例化,裝配和管理。XML是用來描述Bean最爲流行的配置方式。但隨着Spring的日益發展,愈來愈多的人對Spring提出了批評。「Spring項目大量的爛用XML」就是最爲嚴勵的一個批評。因爲Spring會把幾乎全部的業務類都以Bean的形式配置在XML文件中,形成了大量的XML文件。使用XML來配置Bean失去了編譯時的類型安全檢查。大量的XML配置使得整個項目變得更加複雜。安全
隨着JAVA EE 5.0的發佈,其中引入了一個很是重要的特性——Annotations(註釋)。註釋是源代碼的標籤,這些標籤能夠在源代碼層進行處理或經過編譯器把它熔入到class文件中。在JAVA EE5之後的版本中,註釋成爲了一個主要的配置選項。Spring使用註釋來描述Bean的配置與採用XML相比,因類註釋是在一個類源代碼中,能夠得到類型安全檢查的好處。能夠良好的支持重構。app
JavaConfig就是使用註釋來描述Bean配置的組件。JavaConfig 是Spring的一個子項目, 比起Spring,它仍是一個很是年青的項目。目前的版本是1.0 M2。使用XML來配置Bean所能實現的功能,經過JavaConfig一樣能夠很好的實現。ui
下面具體講一講@ConfigurationProperties使用方法this
@ConfigurationProperties
Spring源碼中大量使用了ConfigurationProperties註解,好比server.port
就是由該註解獲取到的,經過與其餘註解配合使用,可以實現Bean的按需配置。url
該註解有一個prefix屬性,經過指定的前綴,綁定配置文件中的配置,該註解能夠放在類上,也能夠放在方法上spa
能夠從註解說明中看到,當將該註解做用於方法上時,若是想要有效的綁定配置,那麼該方法須要有@Bean註解且所屬Class須要有@Configuration註解。
簡單一句話歸納就是:Sring的有效運行是經過上下文(Bean容器)中Bean的配合完成的,Bean能夠簡單理解成對象,有些對象須要指定字段內容,那麼這些內容咱們能夠經過配置文件進行綁定,而後將此Bean歸還給容器
做用於方法
比較常見的就是配置讀寫分離的場景。
配置文件內容
#數據源 spring.datasource.druid.write.url=jdbc:mysql://localhost:3306/jpa spring.datasource.druid.write.username=root spring.datasource.druid.write.password=1 spring.datasource.druid.write.driver-class-name=com.mysql.jdbc.Driver spring.datasource.druid.read.url=jdbc:mysql://localhost:3306/jpa spring.datasource.druid.read.username=root spring.datasource.druid.read.password=1 spring.datasource.druid.read.driver-class-name=com.mysql.jdbc.Driver
java代碼
@Configuration public class DruidDataSourceConfig { /** * DataSource 配置 * @return */ @ConfigurationProperties(prefix = "spring.datasource.druid.read") @Bean(name = "readDruidDataSource") public DataSource readDruidDataSource() { return new DruidDataSource(); } /** * DataSource 配置 * @return */ @ConfigurationProperties(prefix = "spring.datasource.druid.write") @Bean(name = "writeDruidDataSource") @Primary public DataSource writeDruidDataSource() { return new DruidDataSource(); } }
也許有的人看到這裏會比較疑惑,prefix並無指定配置的全限定名,那它是怎麼進行配置綁定的呢?
相信你們確定瞭解@Value註解,它能夠經過全限定名進行配置的綁定,這裏的ConfigurationProperties其實就相似於使用多個@Value同時綁定,綁定的對象就是DataSource類型的對象,並且是 隱式綁定 的,意味着在配置文件編寫的時候須要與對應類的字段名稱 相同,好比上述spring.datasource.druid.write.url=jdbc:mysql://localhost:3306/jpa
,固然了,你也能夠隨便寫個配置,好比 spring.datasource.druid.write.uuu=www.baidu.com
,此時你只須要在註解中加上如下參數便可
以上就完成了多個數據源的配置,爲讀寫分離作了鋪墊
做用於Class類及其用法
配置文件內容
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 @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; } }
總結
- @ConfigurationProperties 和 @value 有着相同的功能,可是 @ConfigurationProperties的寫法更爲方便
- @ConfigurationProperties 的 POJO類的命名比較嚴格,由於它必須和prefix的後綴名要一致, 否則值會綁定不上, 特殊的後綴名是「driver-class-name」這種帶橫槓的狀況,在POJO裏面的命名規則是 下劃線轉駝峯 就能夠綁定成功,因此就是 「driverClassName」