2026/3/9 11:43:44
网站建设
项目流程
迅速提高网站排名,装饰公司网站方案,深圳多语言网站建设,北京中关村在线官网Spring BOOT 启动参数
在Java Web的开发完成后#xff0c;以前我们都会打包成war文件#xff0c;然后放大web容器#xff0c;比如tomcat、jetty这样的容器。现在基于SpringBoot开发的项目#xff0c;我们直接打包成jar文件#xff0c;基于内嵌的tomcat来实现一样的效果。
…Spring BOOT 启动参数在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.encodingUTF-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.encodingUTF-8?-jar?app.jar?--server.port8080?可以在main方法的参数中获取该值log.info(?args:?{},?Arrays.toString(args)?);参数的位置在上面对应arguments位置。优先级系统参数或环境变量启动配置set propvalue export propvalue系统中配置的参数或环境变量Spring中的配置启动参数–spring.config.locationapplication.ymlclasspath:application.ymlEnvironmentAware在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配置加载相关知识可以有效解决配置项不生效问题以及需要快速修改配置项的情况。需要注意的是在加载多个配置文件时如果有冲突的配置项后加载的配置文件中的配置项将覆盖先加载的配置文件中的相同配置项。因此在应用程序中应该避免使用相同的配置项名来定义不同的配置值。