SpringBoot启动参数的实现

 更新时间:2025年01月26日 11:32:16   作者:Java布道者  
SpringBoot通过jar文件方式启动,配置可以通过启动参数进行覆盖,本文就来介绍一下SpringBoot启动参数的实现,感兴趣的可以了解一下

在Java Web的开发完成后,以前我们都会打包成war文件,然后放大web容器,比如tomcat、jetty这样的容器。现在基于SpringBoot开发的项目,我们直接打包成jar文件,基于内嵌的tomcat来实现一样的效果。

而启动的方式变成了这样:

java [ options ] -jar *.jar [ arguments ]

常见配置

我们常见的配置有:

  • --server.port:指定应用程序的端口号。

  • --spring.profiles.active:设置应用程序使用的配置文件中的环境配置。

  • --spring.config.additional-location:指定额外的配置文件路径。

  • --Xms:设置JVM初始堆大小。

  • --Xmx:设置JVM最大堆大小。

  • --XX:PermSize:设置JVM永久代大小。

  • --XX:MaxPermSize:设置JVM最大永久代大小。

  • --Xdebug:开启远程JDWP调试。

  • -D:定义属性。

options

在启动参数中,我们可以通过添加这样的配置,来覆盖系统属性中的值:

java -Dfile.encoding=UTF-8 -jar app.jar 

在代码中可以通过这样获取该值:

String fileEncoding = System.getProperties("file.encoding"); //UTF-8

在很多项目中,都会基于*System.getProperties()*来控制代码流程,这里要注意,通过启动参数配置的值优先级会大于系统中的配置。同时注意改配置出现的位置,在上面使用了options位置来进行区分。

arguments

在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位置。

优先级

系统参数或环境变量:

  • 启动配置

  • set prop=value (export prop=value)

  • 系统中配置的参数或环境变量

Spring中的配置:

  • 启动参数

  • --spring.config.location=application.yml

  • classpath:application.yml

EnvironmentAware

在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;

读取配置顺序

  • 默认配置:Spring Boot 默认提供了一些基本的配置,如应用程序的端口号、上下文路径等。这些配置位于 SpringBoot jar 包中的默认配置文件中。

  • 用户自定义配置:如果应用程序中有自定义的配置文件,Spring Boot 会首先加载这些文件。用户可以通过在应用程序的 classpath 下放置一个名为 application.properties 或 application.yml 的文件来提供自定义配置。

  • 命令行参数:在启动应用程序时,可以通过命令行参数来传递配置。这些参数会被加载并覆盖默认配置和用户自定义配置。

  • 环境变量:环境变量也可以提供配置信息。如果应用程序中定义了环境变量,它们将被加载并覆盖默认配置、用户自定义配置和命令行参数。

  • 系统属性:系统属性也可以提供配置信息。如果应用程序中定义了系统属性,它们将被加载并覆盖默认配置、用户自定义配置、命令行参数和环境变量。

Springboot会先加载PropertiesPropertySourceLoader,后加载YamlPropertySourceLoader,所以先读取的是properties文件。

结束语

了解SpringBoot配置加载相关知识,可以有效解决配置项不生效问题以及需要快速修改配置项的情况。

需要注意的是,在加载多个配置文件时,如果有冲突的配置项,后加载的配置文件中的配置项将覆盖先加载的配置文件中的相同配置项。因此,在应用程序中,应该避免使用相同的配置项名来定义不同的配置值。

到此这篇关于SpringBoot启动参数的实现的文章就介绍到这了,更多相关SpringBoot启动参数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java WSDL接口webService实现方式

    java WSDL接口webService实现方式

    这篇文章主要为大家详细介绍了java WSDL接口webService实现方式的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • SpringBoot中使用Guava实现单机令牌桶限流的示例

    SpringBoot中使用Guava实现单机令牌桶限流的示例

    本文主要介绍了SpringBoot中使用Guava实现单机令牌桶限流的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • Java常用的数据脱敏方法(手机、邮箱、身份证号)

    Java常用的数据脱敏方法(手机、邮箱、身份证号)

    这篇文章主要给大家介绍了关于Java常用的数据脱敏(手机、邮箱、身份证号)的相关资料,信息脱敏对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护,需要的朋友可以参考下
    2023-07-07
  • 详解spring boot starter redis配置文件

    详解spring boot starter redis配置文件

    spring-boot-starter-Redis主要是通过配置RedisConnectionFactory中的相关参数去实现连接redis service。下面通过本文给大家介绍在spring boot的配置文件中redis的基本配置,需要的的朋友参考下
    2017-07-07
  • Java开发中为什么要使用单例模式详解

    Java开发中为什么要使用单例模式详解

    单例对于大家来说并不陌生,但是在什么时候用单例呢?为什么要用呢?本文就带大家了解一下为什么要使用单例,文中有非常详细的介绍,需要的朋友可以参考下
    2021-06-06
  • maven 隐式依赖引起的包冲突解决办法

    maven 隐式依赖引起的包冲突解决办法

    这篇文章主要介绍了maven 隐式依赖引起的包冲突解决办法的相关资料,需要的朋友可以参考下
    2016-12-12
  • java JDBC系列教程之JDBC类的简析与JDBC的基础操作

    java JDBC系列教程之JDBC类的简析与JDBC的基础操作

    这篇文章主要介绍了java JDBC系列教程之JDBC类的简析与JDBC的基础操作,本文分步骤通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • Java实现简单汽车租赁系统

    Java实现简单汽车租赁系统

    这篇文章主要为大家详细介绍了Java实现简单汽车租赁系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • 详解JAVA后端实现统一扫码支付:微信篇

    详解JAVA后端实现统一扫码支付:微信篇

    本篇文章主要介绍了详解JAVA后端实现统一扫码支付:微信篇,这里整理了详细的代码,有需要的小伙伴可以参考下。
    2017-01-01
  • Spring Boot与Spark、Cassandra系统集成开发示例

    Spring Boot与Spark、Cassandra系统集成开发示例

    本文演示以Spark作为分析引擎,Cassandra作为数据存储,而使用Spring Boot来开发驱动程序的示例。对spring boot 与spark cassandra集成开发示例代码感兴趣的朋友跟着脚本之家小编一起学习吧
    2018-02-02

最新评论