Java 使用spring boot在库中设置默认属性
我使用SpringBoot提供了许多不同的服务。我想为每个服务设置一些通用的配置,但允许服务拥有自己的属性,并在需要时覆盖它们。示例属性包括spring.show_横幅、管理url等 我该怎么做?如果我有以下资料:Java 使用spring boot在库中设置默认属性,java,spring,spring-boot,Java,Spring,Spring Boot,我使用SpringBoot提供了许多不同的服务。我想为每个服务设置一些通用的配置,但允许服务拥有自己的属性,并在需要时覆盖它们。示例属性包括spring.show_横幅、管理url等 我该怎么做?如果我有以下资料: 带有默认属性的src/main/resources/application.yml的公共服务 service1具有src/main/resources/application.yml和自己的属性 我希望它们与优先的service1版本合并。相反,似乎只使用在类路径上找到的第一个
- 带有默认属性的src/main/resources/application.yml的公共服务
- service1具有src/main/resources/application.yml和自己的属性
(或者,使用@Configuration类会更好,但我不确定它们是否可以用于定义许多属性)有几个选项可供您选择,所有选项都基于 如果您的公共库负责创建
SpringApplication
,它可以使用setDefaultProperties
。这些值可以由您的服务“应用程序.properties
覆盖
或者,您的库可以在其一个
@Configuration
类上使用@PropertySource
来配置库.properties作为源。同样,这些属性可以在您的服务的应用程序中被覆盖。属性
我不知道您合并它们是什么意思
但我假设最后,您描述的是您具有特定于概要文件的配置的情况。因为,特定于特定服务的任何属性都可以使用Spring配置文件进行管理/注入,始终优先于默认属性文件(请参阅)
例如,您可以拥有文件application-service1.properties,当您使用属性spring.profiles.active=service1运行应用程序时,将自动使用该文件,该属性可以在命令行和位置中指定。
如果不指定此属性,Spring Boot将返回默认的application.properties文件
当然,您可以在这两个文件中写入公共属性:
应用程序属性
application-service1.properties
希望这有帮助
很抱歉,格式错误,我仍然不熟悉编辑器。公共类MyApplicationListener实现ApplicationListener{
public class MyApplicationListener implements ApplicationListener<ApplicationEvent> {
@Override
public void onApplicationEvent(ApplicationEvent event) {
if (event instanceof ApplicationEnvironmentPreparedEvent) {
ApplicationEnvironmentPreparedEvent envEvent = (ApplicationEnvironmentPreparedEvent) event;
ConfigurableEnvironment env = envEvent.getEnvironment();
Properties props = new Properties();
//set props as desired
env.getPropertySources()
.addFirst(new PropertiesPropertySource("customname", props));
}
}
@凌驾
ApplicationEvent上的公共无效(ApplicationEvent事件){
if(ApplicationEnvironmentPreparedEvent的事件实例){
ApplicationEnvironmentPreparedEvent envEvent=(ApplicationEnvironmentPreparedEvent)事件;
ConfigurableEnvironment env=envEvent.getEnvironment();
Properties props=新属性();
//根据需要设置道具
环境getPropertySources()
.addFirst(新属性PropertySource(“customname”,props));
}
}
然后在src/main/resources/META-INF/spring.factories中添加行:
org.springframework.context.ApplicationListener=mypackage.MyApplicationListener
谢谢Andy。您的第二种方法对我很有效。我假设默认的spring引导的属性源为classpath*/application.yml(带星号以查找多个匹配项);但我想这可能会带来问题。我尝试过这种方法,但似乎它不适用于所有属性。例如,spring.main.banner mode=off
似乎不起作用。而其他属性则可以。我假设某些属性在启动阶段使用得太早,无法通过中的PropertySource进行设置外部库?这种理解正确吗?如果正确,设置这些属性的唯一方法是什么?哪些属性受到影响?而另一个属性“spring.output.ansi.enabled”似乎只有在通过命令行属性传递并将其添加到application.yml时才起作用,但当它是默认属性的一部分时才起作用。这确实令人困惑,因为这些设置是否起作用取决于它们的指定方式。这仅适用于.properties文件。如果我使用library.properties-->是否有一种方法可以指定特定于环境的库属性?因此,如果使用应用程序正在运行application-stage.properties,是否有一种简单的方法可以选择library-stage.properties?
service.url=http://api.service.com/endpoint
service.user=admin
service.password=aosdnoni3
public class MyApplicationListener implements ApplicationListener<ApplicationEvent> {
@Override
public void onApplicationEvent(ApplicationEvent event) {
if (event instanceof ApplicationEnvironmentPreparedEvent) {
ApplicationEnvironmentPreparedEvent envEvent = (ApplicationEnvironmentPreparedEvent) event;
ConfigurableEnvironment env = envEvent.getEnvironment();
Properties props = new Properties();
//set props as desired
env.getPropertySources()
.addFirst(new PropertiesPropertySource("customname", props));
}
}