SpringBoot配置詳解

SpringBoot配置詳解

Author:SimpleWuhtml

properteis文件屬性參考大全java

SpringBoot默認加載配置

SpringBoot使用兩種全局的配置文件,全局配置文件能夠對一些默認配置進行修改。mysql

  • application.properties
  • application.yml

這兩個配置文件使咱們SpringBoot啓動的時候回默認加載的配置文件。web

配置文件放在src/main/resources目錄或者類路徑/config下,這個配置文件的路徑是有優先級的,至於優先級後面再說。spring

首先這兩個文件中properties這個文件不須要多說使咱們常常使用的資源文件,但是這個Yml是什麼呢?後面再說sql

配置信息

SpringBoot不須要添加複雜的web.xml或者spring.xml等配置文件,spring只有一個配置文件,也非必須的。json

默認的配置文件是application.properties。數組

#修改端口號
server.port=8888
#定義項目的訪問目錄
server.context-path=/springboot

咱們使用IDEA須要注意,圖就不截圖太麻煩了:springboot

若是properties文件中出現亂碼,找到setting中,在file encoding中勾選Transparent native-to-asci conversion。數據結構

YAML文件

除了默認的properties文件,SpringBoot還提供另一種配置文件yml,這種文件提供一種更加簡潔的方式編寫配置信息。

yml是YAML(YAML Ain‘t Markup Language)語言的文件,是一種標記語言,以數據爲中心,比json、xml等更適合作配置文件,有想法的能夠去網上搜搜資料學習下。

參考語法規範:

官方參考: http://www.yaml.org

yml學習參考:https://www.yiibai.com/yaml/yaml_syntax_primitives.html

YAML基本語法:

  • 以鍵值對的方式表示屬性。(空格必須有)。
  • 使用縮進表示層級關係
  • 縮進時不容許使用Tab鍵,只容許使用空格。
  • 縮進的空格數目不重要,只要相同層級的元素左側對齊便可。
  • 屬性和值是大小寫敏感的。

例子:

server:
    port: 8081
    servlet:
        context-path: springboot

注意:【:後必須跟一個空格】,兩種方式推薦使用yml方式配置項目。

YAML語法

YAML支持的三種數據結構。

  • 字面量:普通的值。(數字,字符串,布爾)
  • 對象:鍵值對的集合。(Map)
  • 數組:一組按次序排列的值。(List,Set)

字面量

YAML中字面量屬於普通的值。以key: value來表示,value前必須帶一個空格。

字面量,字符串默認不須要單雙引號。

雙引號:會轉義字符,特殊字符會被轉義。(name: "SimpleWu\n lisi" //輸出:SimpleWu換行 lisi)

單引號:不會轉義字符,特殊字符不會被轉義。(name: 'SimpleWu\n lisi' //輸出:SimpleWu\n lisi)

server:
  port: 8081

對象、Map

在YAML中,對象和Map都是以鍵值對的方式表示。在下一行來編寫屬性和值得關係,注意縮進。

users:
  firstName: SimpleWu
  email: lovelyWu98k@gmail.com

對象還有另外一種寫法,看到這種寫法是否是想到了JSON?

users: {
    firstName: zhangsan,
    email: lovelyWu98k@gmail.com
}

數組

用-值得方式來表示數組中的一個元素。

users:
    - SimpleWu
    - lovelyWu98k@gmail.com
    - addressisnot

另一種寫法,仍是像JSON

users: [SimpleWu,lovelyWu98k@gmail.com,addressisnot]
將配置映射到實體類

springboot支持咱們直接將properties或者yml中的屬性映射到某個實體類,看例子。

mysql:
    url: jdbc:mysql:///springboot
    port: 3306
    user: root
    pass: root

假如在資源中咱們如今有個mysql的連接信息,咱們如何將它映射到實體類中去呢?

有兩種方式:

  • @ConfigurationProperties指定從配置文件中讀取屬性,prefix指定對應yaml文件中的名稱。
  • @Value獲取配置的屬性值

@ConfigurationProperties

使用IDEA當咱們添加了@ConfigurationProperties註解後,在頁面上回出現一個錯誤提示,咱們須要加入依賴。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

編寫JAVA類MySQLInfo.java

//java類
@ConfigurationProperties(prefix = "mysql")
@Component
public class MySQLInfo {
    private String url;
    private Integer port;
    private String user;
    private String pass;
    //省略getset
}

咱們只須要指定prefix便可,他就會加載咱們yml配置前置爲mysql的屬性。

@Value

若是咱們使用這個註解來獲取屬性使用方式是:

//java類
@Component
public class MySQLInfo {
    @Value("${mysql.url}")
    private String url;
    @Value("${mysql.port}")
    private Integer port;
    @Value("${mysql.user}")
    private String user;
    @Value("${mysql.pass}")
    private String pass;
    //省略getset
}

注意若是須要使用表達式只有@Value才能夠,@Value("#{10*2}) 結果爲:20

兩種方式的區別:

@ConfigurationProperties @Value
功能 批量注入配置文件中的屬性 一個個指定
鬆散綁定 支持 屬性名必須徹底匹配
SPEL表達式 不支持 支持
JSR303效驗 支持 不支持
複雜類型 支持 不支持

兩種方式的適用場合:

當只須要爲某個值提供注入時,推薦使用@Value方式。

當須要對整個對象的總體進行賦值時,使用@ConfigurationProperties。

加載外部配置文件

若是咱們將全部的配置信息都寫在application.yml文件中,則到時候yml文件會變得很是龐大,不太方便咱們進行維護。

咱們能夠對配置中的內容進行拆分,拆分到多個文件中。這樣就提升了配置的可維護性。

引入外部配置文件:

  1. @PropertySource(value={"classpath:student.properties"})
  2. @ImportResource(locations={"classpath:spring.xml"}
  3. @Configuration和@Bean方式。(SpringBoot推薦方式)

第一種方式:@ProperSource方式:須要注入的類的前面使用該註解。

第二種方式:@ImportResource方式首先添加一個spring的配置文件,在裏面添加須要映射的類。在啓動的SpringBootApplication前面使用該註解

第三種方式:@Configuration和@Bean方式添加一個自定義配置類。

//第三種方式
@Configuration
public class MyConfig {
    //將方法的返回值添加到容器中;容器中這個組件默認的id就是方法名
    @Bean
    public MySQLInfo mySQLInfo(){
        System.out.println("配置類@Bean給容器中添加組件了...");
        return new MySQLInfo();
    }
}

切換多個外部配置文件

真實環境中,有時候須要配置多個配置文件,可使用spring.profile.active來進行切換。

好比如今咱們有三個配置文件:

  • application.yml
  • application-dev.yml
  • application-prod.yml

咱們在application.yml中經過spring.profile.active = dev(prod)來選擇須要加裝的配置文件。

或者咱們能夠經過maven將項目打成jar包經過命令行使用如下命令來指定環境

java –jar springboot02-0.0.1-SHAPSHOT.jar –spring.profiles.active=dev

文檔塊

在yml文檔中,能夠適用---來將一個文檔拆分爲多個文檔塊。能夠在不一樣文檔塊中分別定義不一樣的環境。

而後經過spring.profiles=xxx來對文檔塊進行命名。最後經過第一個文檔塊制定spring.profiles.active=xxx來指定到底激活哪一個文檔塊。

#application.yml
spring:
   profiles:
      active: dev #指定激活dev文檔
---
server:
    port: 8081
spring:
    profiles: dev #給文檔命名爲dev

配置文件加載位置和順序

springboot啓動會掃描一下位置的配置文件做爲springboot的默認配置文件。

  1. 項目路徑下的config文件夾
  2. 項目路徑下
  3. classpath路徑下config文件夾
  4. classpath路徑下

以上是按照優先級從高到低的順序,全部位置的文件都會被加載,若是衝突的狀況,高優先級配置內容會覆蓋低優先級配置內容。若是不衝突,造成互補配置。

咱們也能夠經過配置spring.config.location來改變默認配置。使用命令行方式加載,不然優先級不夠。

java –jar xxxx.jar –spring.config.location=配置文件路徑

外部配置加載順序

pringBoot也能夠從如下位置加載配置;優先級從高到低,高優先級的配置覆蓋低優先級的配置,全部配置造成互補配置。

  1. 命令行參數
  2. 來自java:comp/env的JNDI屬性
  3. Java系統屬性(System.getProperties())
  4. 操做系統環境變量
  5. RandomValuePropertySource配置的random.*屬性值
  6. jar包外部的application-{profile}.properties或application.yml(帶spring.profile)配置文件
  7. jar包內部的application-{profile}.properties或application.yml(帶spring.profile)配置文件
  8. jar包外部的application.properties或application.yml(不帶spring.profile)配置文件
  9. jar包內部的application.properties或application.yml(不帶spring.profile)配置文件
  10. @Configuration註解類上的@PropertySource
  11. 經過SpringApplication.setDefaultProperties指定的默認屬性

官方參考文檔:https://docs.spring.io/spring-boot/docs/1.5.9.RELEASE/reference/htmlsingle/#boot-features-external-config

springboot自動配置

SpringBoot啓動會加載大量的自動配置類

咱們看咱們須要的功能有沒有SpringBoot默認寫好的自動配置類;

咱們再來看這個自動配置類中到底配置了哪些組件;(只要咱們要用的組件有,咱們就不須要再來配置了)

給容器中自動配置類添加組件的時候,會從properties類中獲取某些屬性。咱們就能夠在配置文件中指定這些屬性的值;

自動配置原理:SpringBoot啓動的時候,加載主配置類,開啓了自動配置功能@EnableAutoConfiguration。

利用EnableAutoConfigurationImportSelector給容器中導入一些組件。

導入的文件在都配置在文件META‐INF/spring.factories中的EnableAutoConfiguration屬性來獲取的。每個這樣的 xxxAutoConfiguration類都是容器中的一個組件,都加入到容器中;用他們來作自動配置。

每個自動配置類進行自動配置功能;

根據當前不一樣的條件判斷,決定這個配置類是否生效?

這些組件的屬性是從對應的properties類中獲取的,這些類裏面的每個屬性又是和配置文件綁定的;

全部在配置文件中能配置的屬性都是在xxxxProperties類中封裝者‘;配置文件能配置什麼就能夠參照某個功能對應的這個屬性類

相關文章
相關標籤/搜索