SpringBoot-配置檔案

尋找貓的薛定諤發表於2020-12-28

前言註解

總結一下註解方式的屬性注入,順便引入一下SpringBoot的註解@ConfigurationProperties

  1. Spring-IOC註解程式設計一章中瞭解的@PropertySource+@Value註解
user.username=jack
user.password=root
user.hobby[0]=book
user.hobby[1]=music
@Data
@AllArgsConstructor
@NoArgsConstructor
@PropertySource("application.properties")
public class User {
    @Value("${user.username}")
    private String username;
    @Value("${user.password}")
    private String password;
    @Value("${user.hobby[]}")
    private String[] hobby;
    private Address address;
    private List list;
    private Set set;
    private Map map;
    private Properties properties;
}

//這種方式很難注入複雜的引用型別,而且一個個注入太麻煩了
  1. @Component+@ConfigurationProperties註解
@Data
@Component
//@ConfigurationPropertiesScan
//@ComponentScan(basePackages = "com.ty")
@ConfigurationProperties(prefix = "user")
@ConditionalOnBean(name = "user")

public class User {
    private String username;
    private String password;
    private String[] hobby;
    private Address address;
    private List list;
    private Set set;
    private Map map;
    private Properties properties;
  1. @ConfigurationProperties+@EnableConfigurationProperties註解
@Data
@ConfigurationProperties(prefix = "user")
@EnableConfigurationProperties(User.class)
public class User {
    private String username;
    private String password;
    private String[] hobby;
    private Address address;
    private List list;
    private Set set;
    private Map map;
    private Properties properties;
}

另外@EnableConfigurationProperties註解不止可以修飾在POJO上,還可以寫在應用類上

@SpringBootTest(classes = User.class)
@EnableConfigurationProperties(User.class)
public class TestUser {
    @Autowired
    private User user;

    @Test
    void testUser1() {
        System.out.println(user);
    }
}

ps:如果編寫測試程式程式碼最好跟業務程式碼相關類的那個包保持相同

​ 比如java下的com.ty.service,測試的時候最後也是建一個相同的包,即:test下的com.ty.service

​ 也可以不相同,這樣的話就需要在@SpringBootTest註解上配置上要進行的測試類,而且還需要配置@ComponentScan或者

​ @ConfigurationPropertiesScan註解,用來掃描啟動類

再說一下條件裝配註解@Conditional,這個註解之前說過是指滿足Conditional指定的條件,才會進行元件注入

在SpringBoot對它進行了很多實現

下面就說說配置檔案,SpringBoot一共支援2種配置檔案,Properties配置和YAML配置,兩種配置檔案通用,只是展現方式的區別

Properties配置

和以前的properties用法相同,以key = value的方式,不過多贅述!

YAML配置

YAML是“YAML Ain't Markup Language YAML不是一種標記語言”的外語縮寫,但為了強調這種語言以資料做為中心,而不是以置標語言為重點,而用返璞詞重新命名。它是一種直觀的能夠被電腦識別的資料序列化格式,是一個可讀性高並且容易被人類閱讀,容易和指令碼語言互動,用來表達資料序列的程式語言。它是類似於標準通用標記語言的子集XML的資料描述語言,語法比XML簡單很多。

基本使用:

  1. 使用key : 空格 value的方式表示

  2. 大小寫敏感

  3. 使用縮排表示層級關係

  4. 禁止使用tab縮排,只能使用空格鍵

  5. 縮排長度沒有限制,只要元素對齊就表示這些元素屬於一個層級。

  6. 使用#表示註釋

  7. 符串可以不用引號標註

  8. 資料格式表示

    • 基本/簡單型別:key : value

    • 鍵值對集合型別:key : {key 1:value1, key 2:value2, key 3:value3}

      • 或者

        key : 
          key 1: value1
          key 2: value2
          key 3: value3
        
    • 陣列/集合型別:key: [value1,value2,value3]

      • 或者

        key:
         - value1
         - value2
         - value3
        

舉例

首先先導一下依賴,這樣配置的時候會有自動提示

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

<!--打jar包的時候忽略配置提示的相關類-->
<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.springframework.boot</groupId>
                            <artifactId>spring-boot-configuration-processor</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

建立application.yml或者application.yaml

user:
  username: tom
  password: root
  hobby:
    - book
    - "music"
    - 'eat'
  list: [a,b,c,a]
  set:
    - a
    - b
    - c
    - a
  map:
    name:
      james
      tom
    score:
      85
      65
    other: {pet: tomcat,hobby: sing}
  address: [大連,上海,杭州,杭州]
  properties: {book: 西遊}

多環境配置

配置檔案可以用在多環境配置,實際開發中,同一套程式碼可能同時部署到開發、測試、生產等多個伺服器中,每個環境中諸如資料庫密碼等這些個性化配置是避免不了的,雖然我們可以通過自動化運維部署的方式使用外部引數在服務啟動時臨時替換屬性值,但這也意味著運維成本增高。

步驟非常簡單,直接在resources目錄下建立多個配置檔案

比如:application-dev.yml、application-test.yml、application-prod.yml、application.yml

然後在其它的配置檔案編寫對應環境的配置,使用的時候直接在application.yml配置中切換環境

spring:
  profiles:
    active: dev/test/prod