注解@ConfigurationProperties使用方法


注解@ConfigurationProperties使用方法


前言

最近在思考使用java config的方式進行配置,java config是指基於java配置的spring。傳統的Spring一般都是基本xml配置的,后來spring3.0新增了許多java config的注解,特別是spring boot,基本都是清一色的java config。

Spring配置方式

第一階段:xml配置
    在spring 1.x時代,使用spring開發滿眼都是xml配置的bean,隨着項目的擴大,
我們需要把xml配置文件分放到不同的配置文件中,那時候需要頻繁地在開發的類和配置文件間切換。

第二階段:注解配置

在spring 2.x時代,隨着JDK1.5帶來的注解支持,spring提供了聲明bean的注解,
大大減少了配置量。這時spring圈子存在一種爭論:注解配置和xml配置究竟哪個更好?我們最終的選擇是應用
的基本配置用xml,業務配置用戶注解。

第三階段:Java配置(java config)

從spring 3.x到現在,spring提供了Java配置的能力,使用Java配置更好的理解
配置的bean。spring 4.x和spring boot都推薦使用Java配置。

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相比,因類注釋是在一個類源代碼中,可以獲得類型安全檢查的好處。可以良好的支持重構。

JavaConfig就是使用注釋來描述Bean配置的組件。JavaConfig 是Spring的一個子項目, 比起Spring,它還是一個非常年青的項目。目前的版本是1.0 M2。使用XML來配置Bean所能實現的功能,通過JavaConfig同樣可以很好的實現。

下面具體講一講@ConfigurationProperties使用方法

@ConfigurationProperties

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

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

可以從注解說明中看到,當將該注解作用於方法上時,如果想要有效的綁定配置,那么該方法需要有@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;
    }
}

總結

  1. @ConfigurationProperties 和 @value 有着相同的功能,但是 @ConfigurationProperties的寫法更為方便
  2. @ConfigurationProperties 的 POJO類的命名比較嚴格,因為它必須和prefix的后綴名要一致, 不然值會綁定不上, 特殊的后綴名是“driver-class-name”這種帶橫杠的情況,在POJO里面的命名規則是 下划線轉駝峰 就可以綁定成功,所以就是 “driverClassName”


免責聲明!

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



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