很多人選擇Spring Boot就是因為拋棄了以往繁瑣的XML配置,我們只需要在pom.xml文件中引入不同的模塊,比如spring-boot-starter-web、spring-boot-starter-redis、spring-boot-starter-data-mongodb等,這些模塊一般都已經有自己默認的配置,我們只需要在appication.properties中完成一些屬性的配置就可以使用各模塊了。
我們通常會在appication.properties中針對數據庫連接、服務器參數等進行配置,與此同時我們也可以自定義一些參數放在這個文件中供系統(tǒng)使用。
自定義屬性及加載
首先自定義屬性如下
com.bluecoffee.space.author=bluecoffee
com.bluecoffee.space.title=Spring Boot基礎教程
通過@Value("${屬性名}")注解來加載對應的配置屬性,如下所示
@Value("${com.bluecoffee.space.author}")
private String blogAuthor;
@Value("${com.bluecoffee.space.title}")
private String blogTitle;
通過單元測試來驗證一下
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = RestApplication.class)
public class TestProperties {
@Value("${com.bluecoffee.space.author}")
private String blogAuthor;
@Value("${com.bluecoffee.space.title}")
private String blogTitle;
private Logger logger = LoggerFactory.getLogger(this.getClass());
@Test
public void test1(){
try{
Assert.assertEquals("bluecoffee", blogAuthor);
Assert.assertEquals("Spring Boot基礎教程", blogTitle);
}catch (Exception ex){
ex.printStackTrace();
}
}
}
使用隨機數及自定義配置類
有時候我們需要我們的參數不是一個固定值,而是一個隨機數(比如密鑰)。Spring Boot的屬性配置文件中可以通過${random}來產生int值、long值或者String字符串,來支持屬性的隨機值。
#隨機字符串
com.bluecoffee.random.str=${random.value}
#隨機int
com.bluecoffee.random.number=${random.int}
#隨機long
com.bluecoffee.random.bigNumber=${random.long}
#10以內的隨機數
com.bluecoffee.random.test1=${random.int(10)}
#10-20的隨機數
com.bluecoffee.random.test2=${random.int[20,30]}
在這邊配置中我們發(fā)現有一個特點,所有配置都是以"com.bluecoffee.random"開頭的,我們也可以自定義一個配置類來進行聲明,代碼如下
@ConfigurationProperties(prefix = "com.bluecoffee.random")
public class RandomProperties {
private String str;
private Integer number;
private Long bigNumber;
private Integer test1;
private Integer test2;
// getter/setter方法省略
}
在上面一段代碼中用@ConfigurationProperties(prefix = "com.bluecoffee.random")來約定了讀取以"com.bluecoffe.random"開頭的配置項,然后我們別忘了在RestApplication.java中使用@ EnableConfigurationProperties來開啟讀取配置文件的功能。
@SpringBootApplication
@EnableConfigurationProperties(RandomProperties.class)
public class RestApplication {
public static void main(String[] args) throws Exception {
SpringApplication.run(RestApplication.class, args);
}
}
通過命令行來設置屬性值
將Spring Boot應用打包后,我們可以使用java -jar xxx.jar --server.port=9001,通過使用--server.port屬性來設置xxx.jar應用的端口為9001。
在命令行運行時,連續(xù)的兩個減號--就是對application.properties中的屬性值進行賦值的標識。所以,java -jar xxx.jar --server.port=9001命令,等價于我們在application.properties中添加屬性server.port=9001,我們可通過刪除該值或使用命令行來設置該值來驗證。
通過命令行來修改屬性值固然提供了不錯的便利性,但是通過命令行就能更改應用運行的參數,有時候并不安全,不用擔心,Spring Boot也提供了屏蔽命令行訪問屬性的設置,只需要這句設置就能屏蔽:
SpringApplication.setAddCommandLineProperties(false)
多環(huán)境配置
我們知道在研發(fā)過程中,從開發(fā)-測試-上線,至少也有3個環(huán)境,實際上僅測試階段可能還會有SIT、UAT階段,然后每個環(huán)境的配置都不一樣,比如數據庫配置、Redis配置、分布式消息組件配置等。如果在打包環(huán)節(jié)來進行修改配置的話,非常容易出錯。
對于多環(huán)境的配置,有非常多的項目構建工具,原理基本上都是通過配置多份不同環(huán)境的配置文件,再通過打包命令指定需要打包的內容之后進行區(qū)分打包,Spring Boot同樣也支持。
在Spring Boot中多環(huán)境配置文件名需要滿足application-{profile}.properties的格式,其中{profile}對應你的環(huán)境標識,比如:
application-dev.properties:開發(fā)環(huán)境
application-test.properties:測試環(huán)境
application-prod.properties:生產環(huán)境
至于哪個具體的配置文件會被加載,需要在application.properties文件中通過spring.profiles.active屬性來設置,其值對應{profile}值。
如:spring.profiles.active=prod就會加載application-prod.properties配置文件內容
下面,以不同環(huán)境配置不同的服務端口為例,進行測試:
針對各環(huán)境新建不同的配置文件application-dev.properties、application-test.properties、application-prod.properties
在這三個文件均都設置不同的server.port屬性,如:dev環(huán)境設置為1111,test環(huán)境設置為2222,prod環(huán)境設置為3333
application.properties中設置spring.profiles.active=dev,就是說默認以dev環(huán)境設置
測試不同配置的加載
執(zhí)行java -jar xxx.jar,可以觀察到服務端口被設置為1111,也就是默認的開發(fā)環(huán)境(dev)
執(zhí)行java -jar xxx.jar --spring.profiles.active=test,可以觀察到服務端口被設置為2222,也就是測試環(huán)境的配置(test)
執(zhí)行java -jar xxx.jar --spring.profiles.active=prod,可以觀察到服務端口被設置為3333,也就是生產環(huán)境的配置(prod)
按照上面的實驗,可以如下總結多環(huán)境的配置思路:
- application.properties中配置通用內容,并設置spring.profiles.active=dev,以開發(fā)環(huán)境為默認配置
- application-{profile}.properties中配置各個環(huán)境不同的內容
- 通過java -jar xxx.jar --spring.profiles.active={}方式去激活不同環(huán)境的配置
完整代碼戳這里: Chapter 2-1-1 - 自定義參數及多環(huán)境配置