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
而且四個目錄的優先級從上到下依次下降, 也就是說若是你在這四個目錄下都定義了配置文件, 優先級高的會將優先級低的配置覆蓋. 具體以下圖所示:spring
下面咱們使用數據庫的配置來介紹如何使用兩種不一樣格式的配置文件.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
複製代碼
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
這裏說明一下 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就是幫你解決不一樣環境的配置問題的.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;
}
複製代碼