0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Spring Boot配置加载相关知识

科技绿洲 来源:了不起 作者:了不起 2023-10-07 15:47 次阅读

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配置加载相关知识,可以有效解决配置项不生效问题以及需要快速修改配置项的情况。

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 文件
    +关注

    关注

    1

    文章

    541

    浏览量

    24476
  • 端口
    +关注

    关注

    4

    文章

    871

    浏览量

    31744
  • 容器
    +关注

    关注

    0

    文章

    483

    浏览量

    21932
  • 应用程序
    +关注

    关注

    37

    文章

    3175

    浏览量

    57117
  • spring
    +关注

    关注

    0

    文章

    334

    浏览量

    14211
收藏 人收藏

    评论

    相关推荐

    启动Spring Boot项目应用的三种方法

    首先大家了解什么是Spring BootSpring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用
    发表于 01-14 17:33

    Spring Boot嵌入式Web容器原理是什么

    ,不需要配置任何特殊的XML配置,为了这个目标,Spring BootSpring 4.0框架之上提供了很多特性,帮助应用以“约定优于
    发表于 12-16 07:57

    Spring Boot从零入门1 详述

    在开始学习Spring Boot之前,我之前从未接触过Spring相关的项目,Java基础还是几年前自学的,现在估计也忘得差不多了吧,写Spring
    的头像 发表于 12-10 22:18 484次阅读

    Spring认证」什么是Spring GraphQL?

    这个项目建立在 Boot 2.x 上,但它应该与最新的 Boot2.4.x5 相关。 要创建项目,请转到start.spring.io并为要使用的GraphQL传输选择启动器: 启动机
    的头像 发表于 08-10 14:08 665次阅读
    「<b class='flag-5'>Spring</b>认证」什么是<b class='flag-5'>Spring</b> GraphQL?

    Spring认证是什么?

    ,例如:配置、组件扫描、AOP、数据访问和事务、REST、安全、自动配置、执行器、 Spring boot测试等。
    的头像 发表于 07-04 10:19 1144次阅读
    <b class='flag-5'>Spring</b>认证是什么?

    Spring Boot特有的实践

    Spring Boot是最流行的用于开发微服务的Java框架。在本文中,我将与你分享自2016年以来我在专业开发中使用Spring Boot所采用的最佳实践。这些内容是基于我的个人经验
    的头像 发表于 09-29 10:24 713次阅读

    强大的Spring Boot 3.0要来了

    来源:OSC开源社区(ID:oschina2013) Spring Boot 3.0 首个 RC 已发布,此外还为两个分支发布了更新:2.7.5 2.6.13。 3.0.0-RC1: https
    的头像 发表于 10-31 11:17 1285次阅读

    Spring Boot Web相关的基础知识

    上一篇文章我们已经学会了如何通过IDEA快速建立一个Spring Boot项目,还介绍了Spring Boot项目的结构,介绍了项目配置文件
    的头像 发表于 03-17 15:03 520次阅读

    简述Spring Boot数据校验

    上一篇文章我们了解了Spring Boot Web相关知识,初步了解了spring-boot-starter-web,还了解了@Contr
    的头像 发表于 03-17 15:07 620次阅读

    Spring Boot配置JSON序列化选项的几种方法

    看看配置序列化和反序列化选项的最常用方法。 默认配置 默认情况下,Spring Boot配置将禁用以下
    的头像 发表于 10-09 10:26 1443次阅读

    Spring Boot Actuator快速入门

    一下 Spring Boot Actuator ,学习如何在 Spring Boot 2.x 中使用、配置和扩展这个监控工具。
    的头像 发表于 10-09 17:11 437次阅读

    Spring Boot启动 Eureka流程

    在上篇中已经说过了 Eureka-Server 本质上是一个 web 应用的项目,今天就来看看 Spring Boot 是怎么启动 Eureka 的。 Spring Boot 启动 E
    的头像 发表于 10-10 11:40 521次阅读
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b>启动 Eureka流程

    Spring Boot的启动原理

    可能很多初学者会比较困惑,Spring Boot 是如何做到将应用代码和所有的依赖打包成一个独立的 Jar 包,因为传统的 Java 项目打包成 Jar 包之后,需要通过 -classpath 属性
    的头像 发表于 10-13 11:44 472次阅读
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b>的启动原理

    Spring Boot 的设计目标

    Spring 框架复杂的XML配置。使用 Spring Boot 可以很容易创建一个独立运行的、基于 Spring 的生产级应用程序,而且
    的头像 发表于 10-13 14:56 415次阅读
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b> 的设计目标

    Spring事务传播性的相关知识

    本文主要介绍了Spring事务传播性的相关知识
    的头像 发表于 01-10 09:29 240次阅读
    <b class='flag-5'>Spring</b>事务传播性的<b class='flag-5'>相关</b><b class='flag-5'>知识</b>