Spring BOOT 啟動參數(shù)
在Java Web的開發(fā)完成后,以前我們都會打包成war文件,然后放大web容器,比如tomcat、jetty這樣的容器。現(xiàn)在基于SpringBoot開發(fā)的項目,我們直接打包成jar文件,基于內(nèi)嵌的tomcat來實現(xiàn)一樣的效果。
而啟動的方式變成了這樣:
java [ options ] -jar *.jar [ arguments ]
常見配置
我們常見的配置有:
- --server.port:指定應(yīng)用程序的端口號。
- --spring.profiles.active:設(shè)置應(yīng)用程序使用的配置文件中的環(huán)境配置。
- --spring.config.additional-location:指定額外的配置文件路徑。
- --Xms:設(shè)置JVM初始堆大小。
- --Xmx:設(shè)置JVM最大堆大小。
- --XX:PermSize:設(shè)置JVM永久代大小。
- --XX:MaxPermSize:設(shè)置JVM最大永久代大小。
- --Xdebug:開啟遠(yuǎn)程JDWP調(diào)試。
- -D:定義屬性。
options
在啟動參數(shù)中,我們可以通過添加這樣的配置,來覆蓋系統(tǒng)屬性中的值:
java -Dfile.encoding=UTF-8 -jar app.jar
在代碼中可以通過這樣獲取該值:
String fileEncoding = System.getProperties("file.encoding"); //UTF-8
在很多項目中,都會基于*System.getProperties()*來控制代碼流程,這里要注意,通過啟動參數(shù)配置的值優(yōu)先級會大于系統(tǒng)中的配置。同時注意改配置出現(xiàn)的位置,在上面使用了options位置來進(jìn)行區(qū)分。
arguments
在SpringBoot項目中,我們一般把配置都會寫在application.yml文件中,隨著項目一并打包到j(luò)ar文件中,在生產(chǎn)環(huán)境中, 啟動項目時通過添加*--spring.config.location=/application.yml*來修改項目的配置文件指向,從而實現(xiàn)覆蓋application的效果。
同樣,我們可以通過配置啟動參數(shù)來覆蓋application中的某個配置項,比如:
java -Dfile.encoding=UTF-8 -jar app.jar --server.port=8080
可以在main方法的參數(shù)中獲取該值
log.info(" >> >> > args: {}", Arrays.toString(args) );
參數(shù)的位置在上面對應(yīng)arguments位置。
優(yōu)先級
系統(tǒng)參數(shù)或環(huán)境變量:
- 啟動配置
- set prop=value (export prop=value)
- 系統(tǒng)中配置的參數(shù)或環(huán)境變量
Spring中的配置:
- 啟動參數(shù)
- --spring.config.location=application.yml
- classpath:application.yml
EnvironmentAware
在Spring中,提供了一個Aware接口 EnvironmentAware ,通過該接口我們可以很方便地獲取上面說的那些參數(shù),不用關(guān)心是系統(tǒng)屬性、環(huán)境變量還是main方法的args。
public class MyService implements ApplicationContextAware, EnvironmentAware {
@Override
public void setEnvironment(Environment environment) {
// 可以讀取System properties|env 數(shù)據(jù);系統(tǒng)參數(shù)
log.info(" >> >> > 從系統(tǒng)屬性中取值: {}", environment.getProperty("file.encoding") );
}
}
通過觀察SpringBoot啟動流程中,其中在SpringApplication的run方法中,可以看到系統(tǒng)環(huán)境屬性加載過程
ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments);
基于StandardEnvironment的擴(kuò)展。
public class StandardEnvironment extends AbstractEnvironment {
public static final String SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME = "systemEnvironment";
public static final String SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME = "systemProperties";
@Override
protected void customizePropertySources(MutablePropertySources propertySources) {
propertySources.addLast(
new PropertiesPropertySource(SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME, getSystemProperties()));
propertySources.addLast(
new SystemEnvironmentPropertySource(SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME, getSystemEnvironment()));
}
}
我們看到的這樣的寫法其實就是基于SpEL對PropertySources的資源的解析:
@Value("#{systemProperties['file.encoding']}")
private String fileEncoding;
@Value("#{systemEnvironment['JAVA_HOME']}")
private String javaHome;
讀取配置順序
- 默認(rèn)配置:Spring Boot 默認(rèn)提供了一些基本的配置,如應(yīng)用程序的端口號、上下文路徑等。這些配置位于 SpringBoot jar 包中的默認(rèn)配置文件中。
- 用戶自定義配置:如果應(yīng)用程序中有自定義的配置文件,Spring Boot 會首先加載這些文件。用戶可以通過在應(yīng)用程序的 classpath 下放置一個名為 application.properties 或 application.yml 的文件來提供自定義配置。
- 命令行參數(shù):在啟動應(yīng)用程序時,可以通過命令行參數(shù)來傳遞配置。這些參數(shù)會被加載并覆蓋默認(rèn)配置和用戶自定義配置。
- 環(huán)境變量:環(huán)境變量也可以提供配置信息。如果應(yīng)用程序中定義了環(huán)境變量,它們將被加載并覆蓋默認(rèn)配置、用戶自定義配置和命令行參數(shù)。
- 系統(tǒng)屬性:系統(tǒng)屬性也可以提供配置信息。如果應(yīng)用程序中定義了系統(tǒng)屬性,它們將被加載并覆蓋默認(rèn)配置、用戶自定義配置、命令行參數(shù)和環(huán)境變量。
Springboot會先加載PropertiesPropertySourceLoader,后加載YamlPropertySourceLoader,所以先讀取的是properties文件。
結(jié)束語
了解SpringBoot配置加載相關(guān)知識,可以有效解決配置項不生效問題以及需要快速修改配置項的情況。
需要注意的是,在加載多個配置文件時,如果有沖突的配置項,后加載的配置文件中的配置項將覆蓋先加載的配置文件中的相同配置項。因此,在應(yīng)用程序中,應(yīng)該避免使用相同的配置項名來定義不同的配置值。
-
文件
+關(guān)注
關(guān)注
1文章
565瀏覽量
24727 -
端口
+關(guān)注
關(guān)注
4文章
963瀏覽量
32051 -
容器
+關(guān)注
關(guān)注
0文章
495瀏覽量
22060 -
應(yīng)用程序
+關(guān)注
關(guān)注
37文章
3265瀏覽量
57677 -
spring
+關(guān)注
關(guān)注
0文章
340瀏覽量
14338
發(fā)布評論請先 登錄
相關(guān)推薦
評論