springBoot激活指定的配置文件和修改配置文件中的属性值

news/2024/12/29 3:14:23/

目录

前言

一、激活指定的配置文件

1.1通过java运行参数进行指定

1.2 通过在application.properties中添加配置项

二、修改具体的配置属性

三、-Dkey=value 生效的原因

小结:

总结




前言

        在使用springboot项目进行开发与部署时,很多时候需要多种环境(配置文件)进行切换,如果我们每次切换环境时都通过对指定的文件中的属性值进行更改,就有些麻烦。这时候我们可以通过激活指定的配置文件来切换环境。


一、激活指定的配置文件

激活指定配置文件有两种方式,一种是通过配置java运行参数指定,一种是通过配置application.properties属性完成

1.1通过java运行参数进行指定

     具体命令如下:

java -jar -Dspring.profiles.active=dev demo.jar

   说明: 

   dev 是在resources目录下的配置文件application-dev.properties的后缀,支持properties和yaml格式。

    需要注意的是,我们会一般会把配置文件命名为application-dev.properties,application-test.properties,application-pro.properties,实际上spring并没有对后缀进行限制,如application-dev1.properties,配置文件通过java -jar -Dspring.profiles.active=dev1 demo.jar命令也是可以正常生效的。如果我们不指定 -Dspring.profiles.active属性或默认使用application.properties

1.2 通过在application.properties中添加配置项

spring.profiles.active=dev

 说明:

  springboot在启动时会读取application.properties配置文件内容。通过配置spring.profiles.active 也可以达到相同的效果。

二、修改具体的配置属性

在某些情况下需要修改配置文件中已经配置好的配置文件,可以通过命令:

java -jar -Dkey=value demo.jar

小结:

     通过前面的内容可以看到 在java -jar 后面 加 -Dkey=value 的方式可以对spring中的配置进行赋值或修改。那么,springboot到底是怎么做到的呢。有兴趣的朋友可以继续往下看

三、-Dkey=value 生效的原因

要弄清这个原因,我们还要从springBoot启动的源头(main方法)说起。

我们启动一个springBoot项目,一般都会通过run方法进行启动,如下所示:SpringApplication.run(SpringApplicationTest.class, args);现在我们就通过源码查看一下run方法里做了哪些事情。 

首先进入我们视线的是SpringApplication中的run方法,其中有一个prepareEnvironment方法引起了我们的注意,通过方法名和返回参数我猜测到这个方法的作用可能是初始化一个运行所需的配置环境。

public ConfigurableApplicationContext run(String... args) {StopWatch stopWatch = new StopWatch();stopWatch.start();ConfigurableApplicationContext context = null;configureHeadlessProperty();SpringApplicationRunListeners listeners = getRunListeners(args);listeners.starting();try {ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments); // 初始化配置环境configureIgnoreBeanInfo(environment);//.....省略若干行代码}listeners.started(context);callRunners(context, applicationArguments);}// ...... 省略若干行代码return context;}

现在我们到prepareEnvironment方法内部接着往下看, getOrCreateEnvironment方法的语义翻译是准备一个环境,看来这个方法是获取配置的关键方法。

private ConfigurableEnvironment prepareEnvironment(SpringApplicationRunListeners listeners,ApplicationArguments applicationArguments) {// Create and configure the environmentConfigurableEnvironment environment = getOrCreateEnvironment();configureEnvironment(environment, applicationArguments.getSourceArgs());ConfigurationPropertySources.attach(environment);listeners.environmentPrepared(environment);bindToSpringApplication(environment);if (!this.isCustomEnvironment) {environment = new EnvironmentConverter(getClassLoader()).convertEnvironmentIfNecessary(environment,deduceEnvironmentClass());}ConfigurationPropertySources.attach(environment);return environment;}

进入getOrCreateEnvironment方法后发现,方法会根据运行环境不同去实例化不同的Environment对象,由于我启动的项目是一个web项目,所以这里会走SERVLET的条件,现在重点就是要看一下在new StandardServletEnvironment()方法中做了哪些事情吧。

	private ConfigurableEnvironment getOrCreateEnvironment() {if (this.environment != null) {return this.environment;}switch (this.webApplicationType) {case SERVLET:return new StandardServletEnvironment();//由于我的项目是一个web服务,所以会创建一个StandardServletEnvironment对象case REACTIVE:return new StandardReactiveWebEnvironment();default:return new StandardEnvironment();}}

 StandardServletEnvironment类继承了StandardEnvironment类,StandardEnvironment类又继承了AbstractEnvironment类。在StandardServletEnvironment,和StandardEnvironment中都没有显示的指定无参构造方法,只有抽象父类AbstractEnvironment中指定了无参构造,我们来看一下其无参构造做了哪些事情:

public AbstractEnvironment() {customizePropertySources(this.propertySources);}

通过上面的代码看出,构造方法中就一行代码,作用是自定义属性来源,有意思的是在customizePropertySources内部并没有做任何事情,而是有子类去重写这个方法,看到这里让我想到这里还采用了模板方法的设计模式,将特定的动作由子类去实现。那现在我们在来看一下子类是如何定义这个行为的。下面是StandardServletEnvironment类中的方法,看到这我的内心是拒绝的,这个方法又调用了父类的方法(城里人真会玩)。没得办法,那我们来看看父类在这个方法里又干了什么事情吧

protected void customizePropertySources(MutablePropertySources propertySources) {propertySources.addLast(new StubPropertySource(SERVLET_CONFIG_PROPERTY_SOURCE_NAME));propertySources.addLast(new StubPropertySource(SERVLET_CONTEXT_PROPERTY_SOURCE_NAME));if (JndiLocatorDelegate.isDefaultJndiEnvironmentAvailable()) {propertySources.addLast(new JndiPropertySource(JNDI_PROPERTY_SOURCE_NAME));}super.customizePropertySources(propertySources);}

 看到这里,我不经心中一喜,getSystemEnvironment不就是从系统环境中获取属性信息吗,看来关键点就在这里了。

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()));}
public Map<String, Object> getSystemEnvironment() {if (suppressGetenvAccess()) {return Collections.emptyMap();}try {return (Map) System.getenv();//jdk包下的方法}
}

 为了验证我的猜想,自己写一个简单的测试类看一下,是不是如我们猜想一样:

首先配置jvm运行属性-Dkey=value 接着我们运行这段代码:

public static void main(String[] args) {Properties properties = System.getProperties();System.out.println(properties.getProperty("key")); //value}

运行结果确实是value,看来我们的猜想是对的。

小结:

通过java -java -Dkey=value的方式对springboot中的属性赋值其实并不是spring的独创,spring只是通过System.getenv()拿到系统的环境变量而已


总结

以上就是我关于springboot修改配置文件的一些看法,欢迎大家提出疑问与见解。


http://www.ppmy.cn/news/357776.html

相关文章

配置文件 Properties

配置文件 Properties Properties&#xff08;Java.util.Properties&#xff09;&#xff0c;该类主要用于读取Java的配置文件&#xff0c;不同的编程语言有自己所支持的配置文件&#xff0c;配置文件中很多变量是经常改变的&#xff0c;为了方便用户的配置&#xff0c;能让用户…

孢子(SPORE)试玩3小时[纯水贴 ^_^]

昨晚提前下班拿着饭盒回家吃饭&#xff0c;饭后塞了两个苹果后饱得实在动不了&#xff0c;本想躺下看看新闻再工作&#xff0c;但是TVB的新闻还没有到能download的时间&#xff0c;郁闷之中突然想起前天在老婆仔机子拿过来的《孢子(SPORE)》&#xff0c;再想着前几天看到的那些…

Nat Micro:房刚组揭示细菌表观遗传调节艰难梭菌孢子形成

责编 | 兮 艰难梭菌 (Clostridioides difficile 简称 C. diff) 感染是最常见的医院获得性感染之一。仅在美国&#xff0c;每年有大概五十万人感染&#xff0c;造成近50亿美元的医疗负担【1】。老年住院患者中艰难梭菌感染所致并发症和死亡日益增多&#xff1a;百分之十的人会在…

学以致用--游戏:孢子(Spore) 中 殖民地 最佳布局

具体布局图如上&#xff1a;1-11个可选建筑位置&#xff08;编号1-11&#xff09;中间1个固定建筑(未编号)。共计18条连续产生效果&#xff08;a[0]-a[11],然后多次尝试之后&#xff0c;写出如下代码。 #include <iostream> using namespace std; int f 1, y 2, g 3;…

MPB:北林张静等-丛枝菌根真菌(AMF)孢子、菌丝密度及侵染率定量测定方法

为进一步提高《微生物组实验手册》稿件质量&#xff0c;本项目新增大众评审环节。文章在通过同行评审后&#xff0c;采用公众号推送方式分享全文&#xff0c;任何人均可在线提交修改意见。公众号格式显示略有问题&#xff0c;建议电脑端点击文末阅读原文下载PDF审稿。在线文档(…

java孢子进化_孢子的进化起源

孢子的进化起源是一款相当优秀的生存模拟游戏。在这款游戏中玩家们将会享受属于自己的孢子进化。你最开始只是这个世界上最简单和弱小的存在&#xff0c;但是你可以通过寄生和吞噬等手段&#xff0c;让自己不断进化&#xff0c;拥有更多独特的能力&#xff0c;最终成为唯一的霸…

孢子

孢子 http://detail.zol.com.cn/lcd/index351988.shtml

小孢子的神奇之旅-如何阅读MindSpore报错信息(2)

小孢子的神奇之旅-如何阅读MindSpore报错信息(2) 先回忆下自修孢问题解决的三步巅峰论&#xff0c;“1&#xff09;理解问题原因 2&#xff09;找到问题出在哪里 3&#xff09;改了”&#xff0c;我们在上篇文章应用三步论解决了MindSpore Primitive算子执行的一个小问题&#…