代碼從開發到測試要通過各類環境,開發環境,測試環境,demo環境,線上環境,各類環境的配置都不同,同時要方便各類角色如運維,接口測試, 功能測試,全鏈路測試的配置,hardcode 確定不合適,如Spring profile同樣寫在jar包不合適.分佈式應用中通常採用集中管理配置的方式,經過使用開源軟件,如阿里的diamond,netflix的consul等等,SpringBoot中提供了各類各樣的配置方式,下面一一來分析下.html
這些方式優先級以下:
a. 命令行參數
b. 來自java:comp/env的JNDI屬性
c. Java系統屬性(System.getProperties())
d. 操做系統環境變量
e. RandomValuePropertySource配置的random.*屬性值
f. jar外部的application-{profile}.properties或application.yml(帶spring.profile)配置文件
g. jar內部的application-{profile}.properties或application.yml(帶spring.profile)配置文件
h. jar外部的application.properties或application.yml(不帶spring.profile)配置文件
i. jar內部的application.properties或application.yml(不帶spring.profile)配置文件
j. @Configuration註解類上的@PropertySource
k. 經過SpringApplication.setDefaultProperties指定的默認屬性java
@Componentpublic class UserProperties { @Value("${myname}") private String myname; }
啓動命令: java -jar *.jar --myname="KevinSun"
其餘java 系統屬性, 操做系統屬性都是相似處理方案若是不想經過命令行啓動 能夠用下面方法取消.spring
SpringApplication.setAddCommandLineProperties(false);
不一樣的環境可能須要不一樣配置,能夠經過
application{profile}.properties來解決這個問題.
首先:新建application-dev..properties 文件,增長鬚要參數其次啓動命令:mongodb
java -jar ***.jar --spring.profiles.active=dev
application-{profile}.properties 文件和默認的application.properties的加載方式本質是一致的,能夠參照4中的內容.須要注意的是:application.properties 會首先被加載.安全
而後:從application-{profile}.properties中獲取替換,因此一些基本固定的值能夠寫在application.properties, 而後個性化配置寫在application-{profile}.properties中。springboot
具體用法參照個人:第十四章 springboot + profile(不一樣環境讀取不一樣配置)app
SpringBoot中默認的從application.properties文件中加載參數,大量狀況下默認是寫在這個文件中的.
a. application.properties 讀取的優先級
i. file:./config/ 當前與jar同級目錄下的config
ii. file:./ 當前jar目錄
iii. classpath:/config/ jar包中classpath的 config目錄下
iv. classpath:/ jar包中classpath 路徑下
排列的順序 就是 加載的優先級,application.properties只會被加載一次
b. 使用自定義文件
若是你以爲 application.properties不夠酷,你能夠定義本身的文件名, 這裏也有兩種方式
i. 使用命令運維
java -jar ***.jar --spring.config.name=myproject
這時就會加載myproject.propertie而且 application.properties不會被加載的.
ii. 使用命令 dom
java -jar ***.jar spring.config.location=classpath:/myproject.properties
這種狀況下 application.properties也是會被加載,使用方式application-{profile}.properties相同.
c. 使用${}進行屬性佔位符替換分佈式
spring.data.mongodb.host=192.168.1.1 spring.data.mongodb.port=1234 spring.data1.mongodb.host=${spring.data.mongodb.host}_test spring.data1.mongodb.port=${spring.data.mongodb.port}_test spring.data1.mongodb.database=${random.value}_test
注意最後一個配置,這使用random 生產隨機值的方式, 在測試中能夠用來造數據。
d. 類型安全加載
使用@value 進行屬性的注入有的時候可能比較笨重, spring 提供一種強類型的bean 來替代這種方式
@Configuration @EnableConfigurationProperties(UserProperties.class) public class MyConfiguration{ }
@Component @ConfigurationProperties(prefix = "spring.data.mongodb") public class UserProperties { private String host; private int prot; }
spring.data.mongodb.host=192.168.1.1 spring.data.mongodb.port=1234