在Java Web的開發完成后,以前我們都會打包成war文件,然后放大web容器,比如tomcat、jetty這樣的容器。現在基于SpringBoot開發的項目,我們直接打包成jar文件,基于內嵌的tomcat來實現一樣的效果。
而啟動的方式變成了這樣:
java [ options ] -jar *.jar [ arguments ]
我們常見的配置有:
在啟動參數中,我們可以通過添加這樣的配置,來覆蓋系統屬性中的值:
java -Dfile.encoding=UTF-8 -jar app.jar
在代碼中可以通過這樣獲取該值:
String fileEncoding = System.getProperties("file.encoding"); //UTF-8
在很多項目中,都會基于*System.getProperties()*來控制代碼流程,這里要注意,通過啟動參數配置的值優先級會大于系統中的配置。同時注意改配置出現的位置,在上面使用了options位置來進行區分。
在SpringBoot項目中,我們一般把配置都會寫在application.yml文件中,隨著項目一并打包到jar文件中,在生產環境中, 啟動項目時通過添加*--spring.config.location=/application.yml*來修改項目的配置文件指向,從而實現覆蓋application的效果。
同樣,我們可以通過配置啟動參數來覆蓋application中的某個配置項,比如:
java -Dfile.encoding=UTF-8 -jar app.jar --server.port=8080
可以在main方法的參數中獲取該值
log.info(">>>>> args: {}", Arrays.toString(args) );
參數的位置在上面對應arguments位置。
系統參數或環境變量:
Spring中的配置:
在Spring中,提供了一個Aware接口EnvironmentAware,通過該接口我們可以很方便地獲取上面說的那些參數,不用關心是系統屬性、環境變量還是main方法的args。
public class MyService implements ApplicationContextAware, EnvironmentAware { @Override public void setEnvironment(Environment environment) { // 可以讀取System properties|env 數據;系統參數 log.info(">>>>> 從系統屬性中取值: {}", environment.getProperty("file.encoding") ); }}
通過觀察SpringBoot啟動流程中,其中在SpringApplication的run方法中,可以看到系統環境屬性加載過程
ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments);
基于StandardEnvironment的擴展。
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;
Springboot會先加載PropertiesPropertySourceLoader,后加載YamlPropertySourceLoader,所以先讀取的是properties文件。
了解SpringBoot配置加載相關知識,可以有效解決配置項不生效問題以及需要快速修改配置項的情況。
需要注意的是,在加載多個配置文件時,如果有沖突的配置項,后加載的配置文件中的配置項將覆蓋先加載的配置文件中的相同配置項。因此,在應用程序中,應該避免使用相同的配置項名來定義不同的配置值。
本文鏈接:http://www.tebozhan.com/showinfo-26-11852-0.htmlSpring BOOT 啟動參數
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: 使用查詢分離后從20s優化到500ms
下一篇: 五分鐘k8s入門到實戰-應用配置