Spring BOOT 启动参数

Spring BOOT 启动参数

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

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

java?[?options?]?-jar?*.jar?[?arguments?]
常见配置

我们常见的配置有:

  1. –server.port:指定应用程序的端口号。

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

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

  4. –Xms:设置JVM初始堆大小。

  5. –Xmx:设置JVM最大堆大小。

  6. –XX:PermSize:设置JVM永久代大小。

  7. –XX:MaxPermSize:设置JVM最大永久代大小。

  8. –Xdebug:开启远程JDWP调试。

  9. -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;
读取配置顺序
  1. 默认配置:Spring Boot 默认提供了一些基本的配置,如应用程序的端口号、上下文路径等。这些配置位于 SpringBoot jar 包中的默认配置文件中。

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

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

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

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

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

结束语

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/973724.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

探索无网用Deepseek+qwen来助力Solidworks二次开发

在本教程中,我们将详细介绍如何在本地环境中使用 DeepSeek 和 Qwen 模型,结合 AnythingLLM,构建一个用于 SolidWorks 二次开发的私有化智能知识库。 目录 前言 环境准备 2.1 安装 Ollama 2.2 安装 Docker Desktop DeepSeek 本地部署 3.1…

在nodejs中使用ElasticSearch(一)安装,使用

使用docker安装ElasticSearch和Kibana 1)创建相应的data文件夹和子文件夹用来持久化ElasticSearch和kibana数据 2)提前创建好elasticsearch配置文件 data/elasticsearch/config/elasticsearch.yml文件 # Elasticsearch Configuration # # NOTE: Elas…

Jenkins整合Jmeter实现接口自动化测试

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一、安装jmeter 下载:http://jmeter.apache.org/download_jmeter.cgi 这里我用了一台Windows安装jmeter用来写接口测试的脚本,启动前修改j…

宇树科技13家核心零部件供应商梳理!

2025年2月6日,摩根士丹利(Morgan Stanley)发布最新人形机器人研报:Humanoid 100: Mapping the Humanoid Robot Value Chain(人形机器人100:全球人形机器人产业链梳理)。 Humanoid 100清单清单中…

PostgreSQL 与 MySQL 有哪些区别

PostgreSQL 和 MySQL 是两种流行的开源关系型数据库管理系统(RDBMS),它们在功能、性能、扩展性和适用场景等方面存在显著差异。 以下是 PostgreSQL 和 MySQL 的主要区别: 1. 架构与设计理念 PostgreSQL: 强调标准兼…

springboot整合 xxl-job

文章目录 一、xxl-job是什么二、使用步骤 1. 下载并运行管理端代码2. 访问管理页面,确认是否启动成功3. 配置执行器【在自己的springboot项目中配置】4. 在页面上创建执行器和任务,与项目中绑定 总结参考 一、xxl-job是什么 XXL-JOB 是一个分布式任务调…

conda、anaconda、pip、pytorch、tensorflow有什么区别?

先画一张图,可以大致看出它们的区别和关联: pytorch、tensorflow都是Python的第三方库,相当于封装的代码工具集库,通过import导入使用。这两个都是深度学习框架,用来搭建AI模型什么的,使用范围非常之广&…

java后端开发day18--学生管理系统

(以下内容全部来自上述课程) 1.业务分析并搭建主菜单 1.需求 采取控制台的方式去书写学生管理系统 2.分析 1.初始菜单 2.学生类 属性:id,姓名,年龄,家庭住址 3.添加功能 键盘录入每一个学生信息并添…

【设计模式精讲】结构型模式之代理模式(静态代理、JDK动态代理、cglib动态代理)

文章目录 第五章 结构型模式5.1 代理模式5.1.1 代理模式介绍5.1.2 代理模式原理5.1.3 静态代理实现5.1.4 JDK动态代理5.1.4.1 JDK动态代理实现5.1.4.2 类是如何动态生成的5.1.4.3 代理类的调用过程 5.1.5 cglib动态代理5.1.5.1 cglib动态代理实现5.1.5.2 cglib代理流程 5.1.6 代…

业务流程中的流程管理

流程管理是业务流程管理中至关重要的一环。它专注于规划、组织、指导、控制和优化组织内的各项业务流程,以提高效率、降低成本、提升质量和增强客户满意度。简单来说,流程管理就是管理你的业务是如何完成工作的。 下面将从几个方面详细讲解业务流程中的…

2025年股指期货和股指期权合约交割的通知!

锦鲤三三每日分享期权知识,帮助期权新手及时有效地掌握即市趋势与新资讯! 2025年股指期货和股指期权合约交割的通知! 根据中国金融期货交易所规则及相关规定,以下股指期货和股指期权合约于指定日期进行交割,现将各合…

播放器系列1——总概述

播放器核心架构 模块解释 文件读取 读取视频文件、读取网络文件、读取音频文件,大概分为这三种,目前代码中仅实现了读取视频文件播放,也就是当没有video数据的时候播放器不可使用。 解复用 容器指的是多媒体文件中的封装格式,…

MacOS下使用Ollama本地构建DeepSeek并使用本地Dify构建AI应用

目录 1 大白话说一下文章内容2 作者的电脑配置3 DeepSeek的本地部署3.1 Ollamal的下载和安装3.2 选择合适的deepseek模型3.3 安转deepseek 4 DifyDeepSeek构建Al应用4.1 Dify的安装4.1.1 前置条件4.1.2 拉取代码4.1.3 启动Dify 4.2 Dify控制页面4.3 使用Dify实现个“文章标题生…

神经网络八股(三)

1.什么是梯度消失和梯度爆炸 梯度消失是指梯度在反向传播的过程中逐渐变小,最终趋近于零,这会导致靠前层的神经网络层权重参数更新缓慢,甚至不更新,学习不到有用的特征。 梯度爆炸是指梯度在方向传播过程中逐渐变大,…

第3章 3.3日志 .NET Core日志 NLog使用教程

3.3.1 .NET Core日志基本使用 书中介绍了把日志输出到控制台的使用方式: 安装 Microsoft.Extensions.Logging 和 Microsoft.Extensions.Logging.Console 日志记录代码: using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.…

Springboot的jak安装与配置教程

目录 Windows系统 macOS系统 Linux系统 Windows系统 下载JDK: 访问Oracle官网或其他JDK提供商网站,下载适合Windows系统的JDK版本。网站地址:Oracle 甲骨文中国 | 云应用和云平台点击进入下滑,点击进入下载根据自己的系统选择&…

Vue2是如何利用Object.defineProperty实现数据的双向绑定?

我们之前说道过Object.defineProperty方法有一关键特性,就是数据劫持,通过get/set 拦截属性的读取和修改操作。Vue主要是通过数据劫持结合发布-订阅模式来实现的,利用Object.defineProperty来劫持各个属性的setter和getter,在数据…

Transformer解析——(四)Decoder

本系列已完结,全部文章地址为: Transformer解析——(一)概述-CSDN博客 Transformer解析——(二)Attention注意力机制-CSDN博客 Transformer解析——(三)Encoder-CSDN博客 Transforme…

Vue前端开发-Vant之Layout组件

在Vant 中,Layout组件用于元素的响应式布局,分别由van-row和van-col两个组件来实现,前者表示行,后者被包裹在van-row组件中,表示列,共有24列栅格组成,在van-col组件中,span属性表示所…

【YOLOv8】损失函数

学习视频: yolov8 | 损失函数 之 5、类别损失_哔哩哔哩_bilibili yolov8 | 损失函数 之 6、定位损失 CIoU DFL_哔哩哔哩_bilibili 2.13、yolov8损失函数_哔哩哔哩_bilibili YOLOv8 的损失函数由类别损失和定位损失构成 类别损失:BCE Loss 定位损失…