Spring Boot的兩種配置文件--properties VS yaml

10月份剛剛換了新工做,這也預示着全面轉向Java技術棧,帶着對Spring, Spring Boot, Mybatis, Maven等一切懵懂入職了新公司,領導次日就發給我一個git倉庫的連接,告訴我這個咱們的項目模板,本着先讓代碼跑起來的原則,我去各類搜索springboot項目的基礎,好在模板比較基礎,能很快運行了起來,寫個Controller, 鏈接到本地數據庫也能跑通一個API,心想也挺簡單嘛,看看如何跑起來的吧,因而開始研究代碼,我瞬間就傻了,一下子是yaml文件,一下子是properties文件,一會又是xml配置文件,這都是幹啥的,又是咋用的,能不能不寫這麼多配置文件,或者能不能統一用一種格式的配置文件。通過兩天的研究和實驗,終於大概瞭解各類文件的使用。 現將這些學習成果記錄下來,以便後續查閱。 今天是一系列入門筆記的第一篇:Spring Boot的兩種配置文件。java

雖然Spring Boot中採用了大量的自動化配置,可是在實際的項目中常常須要一些本身的配置,這時候就須要使用配置文件了,在Spring Boot中提供了兩種配置文件格式----properties文件和yaml文件.默認的配置文件名稱是application.properties(或application.yaml)mysql

這些配置文件放在哪

既然這些配置文件時Spring Boot默認的,那我是否是隨便放到一個文件夾裏就能夠了, 你想多了, 固然是要按照規矩辦事. Spring Boot在啓動時會依此在下面的路徑中尋找配置文件git

  • 項目根目錄下的config文件夾
  • 項目根目錄
  • classpath下的config文件夾
  • classpath下

而且四個目錄的優先級從上到下依次下降, 也就是說若是你在這四個目錄下都定義了配置文件, 優先級高的會將優先級低的配置覆蓋. 具體以下圖所示:spring

下面咱們使用數據庫的配置來介紹如何使用兩種不一樣格式的配置文件.

application.properties 的使用

spring.datasource.name=datasource
spring.datasource.druid.filters=stat
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/springBucks?useSSL=false&useUnicode=true&characterEncoding=UTF-8
spring.datasource.username=yourusername
spring.datasource.password=yourpassword
複製代碼

application.yaml 的使用

spring:
 datasource:
 name: datasource
 type: com.alibaba.druid.pool.DruidDataSource
 url: jdbc:mysql://127.0.0.1:3306/test?useSSL=false&useUnicode=true&characterEncoding=UTF-8
 driver-class-name: com.mysql.jdbc.Driver
 username: root
 password: dreamfinal21
 druid:
 filters: stat
 initial-size: 5
 min-idle: 5
 max-active: 20
 max-wait: 60000
 time-between-eviction-runs-millis: 60000
 min-evictable-idle-time-millis: 300000

複製代碼

能夠換個配置文件名字嗎

一般默認的配置文件已經足夠咱們使用了,可是有時咱們會想換一個名字, 或者是給配置文件換一個位置(我的以爲不必), 這些都是能夠知足的. 以下的方式均可以呀;sql

在啓動時指定配置文件的名字和位置

若是你將默認配置文件自定義成app.properties, 而且將其放在自定義的classpath:/customConfig/ 下, 當你把項目打成jar包後,啓動時要指定配置文件的名稱和位置.數據庫

java -jar properties-0.0.1-SNAPSHOT.jar --spring.config.location=classpath:/customConfig/ --spring.config.name=app
複製代碼

固然在開發過程當中你也能夠藉助IDE指定啓動項配置,這裏不詳細闡述,我的不喜歡這種方式,有興趣的能夠本身上網搜索一下.springboot

使用@PropertySource 註解

這裏說明一下 application.properties文件是Spring Boot啓動時默認會加載的配置, 一些自定義的配置是不建議寫在這裏面的,這時就須要寫自定義的配置文件,可是自定義的配置文件默認時不會被Spring Boot加載的,這時就須要使用@PropertySource註解了. 另外須要注意的時@PeopertySource 註解是不支持yaml配置方式的.bash

下面給吃一個使用自定義的配置的實例, 這裏咱們自定義了一個配置文件user.properties, 內容以下:app

user.name=zhangsan
  user.age=23
  user.id=1
複製代碼
@Component
   @PropertySource("classpath:user.properties")
   public class User{
      @Value("${user.id}")
      private Long id;
      @Value("${user.name}")
      private String name;
      @Value("${user.age}")
      private Long age;
      //getter/setter
   }

複製代碼

經過@PropertySource 引入自定義的配置文件的啓發, 那我可否也經過該註解來加載系統配置文件呢? 因而我將application.properties文件重命名成app.properties, 並移動到classpath: /config1/下, 而後在SpringBoot啓動類上加上以下註解:學習

@SpringBootApplication
  @PropertySource("classpath:config1/app.properties")
  public class SpringBucksApplication {

	public static void main(String[] args) {
		SpringApplication.run(SpringBucksApplication.class, args);
	}
  }
複製代碼

哈哈, 居然也能啓動

application-dev.properties或application-prod.properties 是幹嗎用的

在實際項目中咱們一般在不一樣的環境是須要不一樣的配置,好比在開發環境,測試環境已經線上環境的數據庫配置可能都是不同的,你看到的application-dev.properties或application-prod.properties就是幫你解決不一樣環境的配置問題的.Spring Boot約定不一樣的環境配置文件的名稱規則是application-{profile}.properties. 其中{profile}是一個佔位符,用於表示你定義的環境名稱. 使用時你能夠定義不一樣的環境配置文件,那我該怎麼肯定我使用的時哪一個配置文件呢? 我就須要在Spring Boot的配置文件中指定激活哪個profile, 以下所示(也可使用yaml文件):

// 定義了active就使用active指定的profile, 不然使用default指定的profile,若是都不寫, 那就沒有profile可用啦.
spring.profile.active=dev 
spring.profile.defaut=dev
複製代碼

這裏還要在提一點時@Profile註解,該註解用於指定只用在某個profile激活時才裝配該Bean.好比有時咱們但願在不一樣的環境下使用不一樣的datasource, 此時就須要@Profile註解發揮做用了.以下示例, 咱們但願在開發環境使用內嵌的數據庫, 可是在線上環境使用MySQL數據庫,咱們就能夠像這樣定義configuration.

@Bean(name="dataSource")
    @Profile("dev")
    public DataSource embeddedDataSource() {
      return new EmbeddedDatabaseBuilder()
              .setType(EmbeddedDatabaseType.H2)
              .addScript("classpath:schema.sql")
              .addScript("classpath:test-data.sql")
              .build();
    }

    @Bean(name="dataSource")
    @Profile("prod")
    public DataSource hikariDataSource() {

        HikariConfig hikariConfig = new HikariConfig();

        hikariConfig.setDriverClassName("com.mysql.jdbc.Driver");
        hikariConfig.setJdbcUrl(hikaricpUrl);
        hikariConfig.setUsername(hikaricpUsername);
        hikariConfig.setPassword(hikaricpPassword);
        hikariConfig.setAutoCommit(true);
        hikariConfig.setTransactionIsolation("TRANSACTION_READ_COMMITTED");
        hikariConfig.setConnectionTimeout(5000);
        hikariConfig.setIdleTimeout(600000);
        hikariConfig.setMaxLifetime(1800000);
        hikariConfig.setMaximumPoolSize(5);
        hikariConfig.addDataSourceProperty("cachePrepStmts", "true");
        hikariConfig.addDataSourceProperty("prepStmtCacheSize", "250");
        hikariConfig.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
        hikariConfig.addDataSourceProperty("allowMultiQueries", "true");

        HikariDataSource dataSource = new HikariDataSource(hikariConfig);

        return dataSource;
    }
複製代碼
相關文章
相關標籤/搜索