SpringBoot外部化如何配置


这篇文章主要介绍了SpringBoot外部化如何配置的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringBoot外部化如何配置文章都会有所收获,下面我们一起来看看吧。Spring Boot可以让你将配置外部化,这样你就可以在不同的环境中使用相同的应用程序代码。 你可以使用各种外部配置源,包括Java properties 文件、YAML文件、环境变量和命令行参数。属性值可以通过使用 @Value 注解直接注入你的Bean,也可以通过Spring 的 Environment 访问,或者通过 @ConfigurationProperties 绑定到对象。同时 Spring Boot 也提供了一种非常特殊的 PropertyOrder,来允许用户可以在适当的场景下覆盖某些属性值,该顺序旨在允许合理地覆盖值。按以下顺序优先级从低到高, 后者的属性值覆盖前者 ,所有的配置会形成互补配置:默认属性(使用 SpringApplication.setDefaultProperties 指定)@Configuration类上的@PropertySource注解引入的配置属性请注意,这样的属性源直到ApplicationContext被刷新时才会被添加到环境中。这对于配置某些属性来说已经太晚了,比如logging.* spring.main.* ,它们在刷新开始前就已经被读取了。配置数据(例如application.properties文件)对于random.*形式的属性,优先从RandomValuePropertySource获取(指优先于后者)OS environment variables((操作系统环境变量)Java System properties(Java 系统属性System.getProperties())JNDI 属性ServletContext 的 初始化参数ServletConfig 的 初始化参数SPRING_APPLICATION_JSON 属性命令行参数test 模块下的 properties 属性test 模块下 @TestPropertySource 注解引入的配置文件启用 devtools 时 $HOME/.config/spring-boot 路径下的配置配置数据文件按以下加载顺序考虑:打包在 jar 中的应用程序属性(application.properties 和 YAML)打包在 jar 中的特定配置文件的应用程序属性(application-{profile}.properties 和 YAML)打包 jar 之外的应用程序属性(application.properties 和 YAML)打包 jar 之外的特定配置文件的应用程序属性(application-{profile}.properties 和 YAML)XML资源Properties资源YAML资源Profile 本质上代表一种用于组织配置信息的维度,在不同场景下可以代表不同的含义。例如,如果 Profile 代表的是一种状态,我们可以使用 open、halfopen、close 等值来分别代表全开、半开和关闭等。再比如系统需要设置一系列的模板,每个模板中保存着一系列配置项。配置命名规则:Spring Boot 启动时,会自动加载 JAR 包内部及 JAR 包所在目录指定位置的配置文件(Properties 文件、YAML 文件)。列表按优先级排序(较低项目的值覆盖较早项目的值)classpath( –classpath )classpath 根路径classpath 下的 /config 包当前目录( –file )当前目录下当前目录下的 config/ 子目录当前目录下的 config/ 子目录的直接子目录启动时加载配置文件顺序:1 > 2 > 3 > 42.4.0以前版本,默认情况的加载顺序如下:打包在 jar 中的应用程序属性(application.properties 和 YAML)。打包 jar 之外的应用程序属性(application.properties 和 YAML)打包在 jar 中的特定于配置文件的应用程序属性(application-{profile}.properties 和 YAML)打包 jar 之外的特定于配置文件的应用程序属性(application-{profile}.properties 和 YAML)注意:在之前的版本中,JAR 包外部的application.properties配置文件不会覆盖 JAR 包里面的基于 “profile” 的application-{profile}.properties 配置文件。2.4.0以后版本,默认情况的搜索顺序如下:保证了 JAR 包外部的应用程序参数应优先于 JAR 包内部的特定激活的配置参数打包在 jar 中的应用程序属性(application.properties 和 YAML)。打包在 jar 中的特定于配置文件的应用程序属性(application-{profile}.properties 和 YAML)打包 jar 之外的应用程序属性(application.properties 和 YAML)打包 jar 之外的特定于配置文件的应用程序属性(application-{profile}.properties 和 YAML)注意:同一位置下,Properties 文件优先级高于 YAML 文件 , 如果Spring Boot在优先级更高的位置找到了配置,那么它就会无视优先级低的配置。从 Spring Boot 2.4 开始,加载 Properties 和 YAML 文件时候会遵循, 在文档中声明排序靠前的属性将被靠后的属性覆盖 。命令行激活: --spring.profiles.active=prod配置文件激活如上,只需要在application.yml或者properties文件中配置即可注意:在application.yml或者properties文件存在的情况下,不管激活的是prod还是dev,还是会读取默认的配置文件,只不过指定的配置文件会覆盖默认配置文件中的属性可以使用spring.config.import属性从其他地方导入更多的配置数据,比如spring.config.import=my.yaml 。它会将 my.yaml 文件作为临时文件放在当前配置文件之后处理,因此其属性具有更高的优先级在运行Jar包的命令中加入这个参数就可以指定Jar包以外的配置文件的位置了,也可以在application的配置文件中配置该属性这个参数就是指定外部application.yml配置文件位置的参数,它支持classpathfile路径如果您不喜欢application.properties作为配置文件名,您可以通过指定spring.config.name环境属性来切换到另一个文件名对于spring.config.locationspring.config.additional-locationspring.config.import等属性的路径,添加optional:前缀,则当对应文件不存在时应用仍可以正常启动比如spring.config.location=optional:file:/my.yaml,当应用启动加载文件 my.yaml 不存在时,不会抛出异常例如,如果想要获取当前应用程序的名称并作为一个配置项进行管理,那么很简单,我们直接通过 ${spring.application.name} 占位符:假设我们使用 Maven 来构建应用程序,那么可以按如下所示的配置项来动态获取与系统构建过程相关的信息:additional-spring-configuration-metadata.jsonspring-configuration-metadata.json在springboot-starter官方项目或第三方starter项目中随处可见,那它起的作用是什么?配置additional-spring-configuration-metadata.json文件后,在开发人员的IDE工具使用个人编写的配置读取很有效的在application.propertiesapplication.yml文件下完成提示在Maven中,该依赖关系应被声明为可选的,如以下例子所示。在resources/META-INF目录下创建additional-spring-configuration-metadata.json,分类为 “groups” 或 “properties”,附加值提示分类为 “hints”,如以下例子所示:properties 数组中包含的JSON对象可以包含下表中描述的属性。包含在 hints 数组中的JSON对象可以包含下表中的属性。每个 hint 元素的 values 属性中包含的JSON对象可以包含下表中描述的属性。参考:https://www.byun.com/article/191629.htm启动Spring Boot项目时传递参数,有三种参数形式:选项参数,基本格式为--optName[=optValue]--为连续两个减号)非选项参数java -jar xxx.jar abc def系统参数java -jar -Dserver.port=8081 xxx.jar相当于 SpringBoot 基于 Java 命令行参数中的非选项参数自定义了选项参数的规则,具体可以看解析器SimpleCommandLineArgsParser,它里面调用其parse方法对参数进行解析如果您需要访问传递给应用程序的参数SpringApplication.run(…),您可以注入一个ApplicationArguments。该ApplicationArguments接口提供对原始String[]参数以及选项参数和非选项参数的访问,如以下示例所示:另外,选项参数,也可以直接通过@Value在类中获取系统参数可以通过java.lang.System提供的方法获取关于参数值区别,重点看选项参数和系统参数。通过上面的示例我们已经发现使用选项参数时,参数在命令中是位于xxx.jar之后传递的,而系统参数是紧随java -jar之后。如果不按照该顺序进行执行,比如使用如下方式使用选项参数:则会抛出如下异常:如果将系统参数放在jar包后面,问题会更严重,会出现可以正常启动,但参数无法生效。这个错误是最坑的,所以一定谨记:通过-D传递系统参数时,务必放置在待执行的jar包之前。处理@PropertySource注解从ConfigurationClassParser#processPropertySource方法进Spring中@PropertySource默认不支持YAML格式的解析,但是SpringBoot的配免费云主机域名置文件却可以解析YAML,这说明SpringBoot中已经实现了YAML文件的解析,我们只需要复用即可,我们可以看该注解源码Bydefault,adefaultfactoryforstandardresourcefileswillbeused.
*@since4.3
*@seeorg.springframework.core.io.support.DefaultPropertySourceFactory
*@seeorg.springframework.core.io.support.ResourcePropertySource
*/
ClassextendsPropertySourceFactory>factory()defaultPropertySourceFactory.class;PropertySourceFactory的默认实现是DefaultPropertySourceFactoryResourcePropertySource默认不支持YAML,所以我们可以通过实现PropertySourceFactory接口,然后用@PropertySource的factory属性来实现YAML的解析官方文档中有说到:有些事件实际上是在ApplicationContext被创建之前触发的,所以我们不能将这些事件的监听器注册为@Bean。因为这个时候应用上下文还没有被创建,也就是说监听器也还没有被初始化,这个先后顺序不对,会导致这些事件的监听器不会被触发但可以使用SpringApplication.addListeners(...) 方法或SpringApplicationBuilder.listeners(...) 方法注册它们。如果您希望这些侦听器自动注册的话,可以通过新建一个META-INF/spring.factories文件,添加类似以下内容,SpringBoot会自动帮你注册。应用程序运行时,应用程序事件按以下顺序发送:An ApplicationStartingEvent is sent at the start of a run but before any processing, except for the registration of listeners and initializers.An ApplicationEnvironmentPreparedEvent is sent when the Environment to be used in the context is known but before the context is created.An ApplicationContextInitializedEvent is sent when the ApplicationContext is prepared and ApplicationContextInitializers have been called but before any bean definitions are loaded.An ApplicationPreparedEvent is sent just before the refresh is started but after bean definitions have been loaded.An ApplicationStartedEvent is sent after the context has been refreshed but before any application and command-line runners have been called.An AvailabilityChangeEvent is sent right after with LivenessState.CORRECT to indicate that the application is considered as live.An ApplicationReadyEvent is sent after any application and command-line runners have been called.An AvailabilityChangeEvent is sent right after with ReadinessState.ACCEPTING_TRAFFIC to indicate that the application is ready to service requests.An ApplicationFailedEvent is sent if there is an exception on startup.The above list only includes SpringApplicationEvents that are tied to a SpringApplication. In addition to these, the following events are also published after ApplicationPreparedEvent and before ApplicationStartedEvent:A WebServerInitializedEvent is sent after the WebServer is ready. ServletWebServerInitializedEvent and ReactiveWebServerInitializedEvent are the servlet and reactive variants respectively.A ContextRefreshedEvent is sent when an ApplicationContext is refreshed.关于“SpringBoot外部化如何配置”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“SpringBoot外部化如何配置”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注百云主机行业资讯频道。

相关推荐: 怎么用C语言编写实现学生管理系统

这篇文章主要介绍“怎么用C语言编写实现学生管理系统”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么用C语言编写实现学生管理系统”文章能帮助大家解决问题。学生信息管理系统是一个基于C语言开发的系统,其中有用到冒泡排序、…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

Like (0)
Donate 微信扫一扫 微信扫一扫
Previous 05/14 17:55
Next 05/14 17:55

相关推荐