Spring Boot-配置

Spring 官方完整文檔:https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle
Spring 官方配置文檔:https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-external-config
參考:http://www.javashuo.com/article/p-puiuyyig-ev.htmlhtml

Spring Boot 採用的「默認大於配置」的原則,即便沒有配置,也可使用默認配置正常啓動應用。java

各類格式的配置文件

默認全局配置文件的文件名是 application,常見的有 application.propertiesapplication.yml(YAML 格式)、application.xml(XML 格式),web

application.properties 示例:spring

server.port=8081

application.yml 示例:segmentfault

server:
  port: 8081

application.xml 示例:app

<server>
  <port>8081</port>
</server>

類中引入配置文件

要經過 @ConfigurationProperties 註解使用配置文件,須要先 導入依賴,IDEA 會很智能的在自動導入依賴失敗時,彈出 Spring 提示的相關文檔信息,根據提示操做便可。dom

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

編寫配置文件

server:
  port: 8081

person:
  name: kika
  age: 83
  maps:
    key1: v1
    key2: 2
  lists:
    - zhangsan
    - lisi
    - wangwu
  birth: 2011/01/01
  dog:
    name: dd
    age: 2

編寫 Bean 類讀取配置文件

@ConfigurationProperties(prefix = "person") 註解將當前類中的全部屬性跟配置文件綁定,能夠經過參數 prefix 指定前綴。配置文件的文件名必須是 application,例如 application.yml、application.properties、application-dev.yml 等。對於自定義的配置文件,須要用 @PropertySource 註解指定。ide

@Component 註解將當前類添加到 Spring 容器中,從而可使用容器的各類功能。svg

@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    private String name;
    private Integer age;
    private Date birth;
    private Map<String, Object> maps;
    private List<Object> lists;
    private Dog dog;

    @Override
    public String toString() {
        return "Person{" +
                "name=" + name +
                ", age=" + age +
                ", birth=" + birth +
                ", maps=" + maps +
                ", lists=" + lists +
                ", dog=" + dog +
                "}";
    }
//... getter/setter 方法

編寫單元測試

在 /src/test/java/包名 下面,有 XXApplicationTests 測試類。藉助測試類,能夠方便的注入。spring-boot

經過這個測試類來檢查剛纔的配置是否加載成功:

@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoQuickApplicationTests {

    @Autowired
    Person person; // 自動關聯到這個類

    @Test
    public void contextLoads() {
        System.out.println(person); // 測試輸出
    }
}

測試文件寫完後,右擊運行測試類便可執行測試,查看控制檯的輸出便可。

類中引入配置的某個屬性

經過 @ConfigurationProperties 引入整個配置文件,用 @Value 能夠引入單個配置。@Value 註解支持3種語法:

  • 字面量,例如 true/false
  • #{SpEL} 表達式,例如 #{3+5}
  • ${key},從環境變量、配置文件中獲取值
@Value("${person.name}")
private String name;

@Value("#{11+3}")
private Integer age;

@Value("true")
private Boolean adult;

對比 @Value 和 @ConfigurationProperties 註解

  • @Value 只能一個個指定值,@ConfigurationProperties 則批量將配置文件中的屬性注入類
  • @Value 支持 SpEL 表達式:@Value("#{11+3}")
  • @ConfigurationProperties 支持 JSR303 數據校驗,須要引入 @Validated 註解配合,例如:
@Component
@ConfigurationProperties(prefix = "person")
@Validated
public class Person {
    @Email
    private String name; // 若是不知足郵箱校驗,會報錯
    //...

@PropertySource 和 @ImportSource 註解

@PropertySource 加載指定的配置文件

若是使用了非全局配置文件,自定義了配置文件的名稱,能夠用 @PropertySource 註解來加載:

@PropertySource(value ="classpath:person.yml")
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    private String name;
    private Integer age;
    private Date birth;
    //...

@ImportSource 導入 Spring 的配置文件並生效

經過 XML 向容器添加組件

以前都是用 XML 配置文件向容器中添加組件,有幾個步驟,

  • 先寫配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="helloService" class="com.kikakika.demo_quick.service.HelloService"></bean> 
</beans>
  • 而後在代碼中經過 @ImportSource 註解引入組件,注意這個註解要加在 Spring Boot 的啓動類上:
@ImportResource(locations = {"classpath:beans.xml"})
@SpringBootApplication
public class DemoQuickApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoQuickApplication.class, args);
    }
}
  • 最後,寫個測試用例檢查一下,執行下面的 testHelloService 方法便可:
@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoQuickApplicationTests {
    @Autowired
    ApplicationContext ioc;

    @Test
    public void testHelloService() {
        boolean b = ioc.containsBean("helloService");
        System.out.println(b);
    }
}

@Bean 註解的方式添加組件

Spring Boot 開始,推薦用 @Bean 註解的方式添加組件,用配置類替代配置文件:

package com.kikakika.demo_quick.config;

import com.kikakika.demo_quick.service.HelloService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyConfig {

    // @Bean 註解能夠將方法返回值添加到容器中,容器中對應組件的默認ID就是方法名
    @Bean
    public HelloService helloService() {
        System.out.println("success add component");
        return new HelloService();
    }
}

類寫完後,不須要在 Spring Boot 的啓動類中引入,Spring 掃描文件後會自動引入,再執行一次上面的測試,能夠看到結果。

在配置中使用佔位符

Spring Boot 的配置文件中,能夠指定佔位符,會自動解析,相似格式化輸出中的 %d\n 等,語法:

${prefix.key[:default-value]}

例如 ${person.name:zhangsan},系統解析時找不到 person.name 屬性時,會自動使用默認值 zhangsan,不然使用找到的屬性。

佔位符中,有個特殊的隨機值 random,能夠生成隨機的整型、字符串、UUID 等,例如 ${random.int}${random.uuid}

person:
  name: kika${random.uuid}
  age: ${random.int}
  maps:
    key1: ${person.age:30}
    key2: 2

不一樣環境使用不一樣的配置文件

在開發、測試、生產環境的配置文件一般是不一樣的,有下面幾種方式能夠指定配置文件:

  • 在配置文件中指定 spring.profiles.active=dev
  • 傳入命令行參數:java -jar xx.jar --spring.profiles.active=dev
  • 傳入虛擬機參數:-Dspring.profiles.active=dev

單配置文件和多配置文件

通常會將不一樣環境的配置文檔獨立,例如:

  • 默認用 application.yml 文件
  • 測試環境使用 application-dev.yml 文件
  • 生產環境使用 application-prod.yml 文件

Spring Boot 會默認加載 application.yml 文件,因此能夠在這個文件裏指定要激活使用的配置文件,例以下面例子會加載 application-dev.yml 文件:

spring:
  profiles:
    active: dev

YAML 支持多文檔塊,若是多個環境的配置寫在一個文件中,須要在每一個文檔塊中聲明對應的環境:

server:
  port: 8081
spring:
  profiles:
    active: prod
    
---

server:
  port: 8082
spring:
  profiles: dev
  
---

server:
  port: 8083
spring:
  profiles: prod

指定配置文件加載位置

Spring Boot 默認支持的配置文件名爲 application.properties 和 application.yml,默認會依次掃描的位置包括:

  • file:./config/:當前項目下的 config 目錄下,就是 項目目錄/config
  • file:./:當前項目根目錄下
  • classpath:/config/:類路徑的 config 目錄下,就是 /src/main/resources/config
  • classpath:/:類路徑的 config 目錄下,就是 /src/main/resources,默認就在這裏

能夠經過 spring.config.location 改變默認的配置文件位置。

外部配置的加載順序

外部配置官方文檔:https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-external-config

Spring Boot 支持多種外部配置,常見的有(按優先級從高到低排列):

  • 命令行參數,優先級最高,例如 java -jar xx.jar --server.port=8088 --server.context-path=/hello
  • jar 包外部的 appplication-{profile}.properties 或 application.yml(帶 spring.profile)配置文件,只要跟 jar 包在同一個目錄便可生效
  • jar 包內部的 appplication-{profile}.properties 或 application.yml(帶 spring.profile)配置文件
  • jar 包外部的 appplication.properties 或 application.yml(不帶 spring.profile)配置文件,只要跟 jar 包在同一個目錄便可生效
  • jar 包內部的 appplication.properties 或 application.yml(不帶 spring.profile)配置文件
相關文章
相關標籤/搜索