Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用spring boot在库中设置默认属性_Java_Spring_Spring Boot - Fatal编程技术网

Java 使用spring boot在库中设置默认属性

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版本合并。相反,似乎只使用在类路径上找到的第一个

我使用SpringBoot提供了许多不同的服务。我想为每个服务设置一些通用的配置,但允许服务拥有自己的属性,并在需要时覆盖它们。示例属性包括spring.show_横幅、管理url等

我该怎么做?如果我有以下资料:

  • 带有默认属性的src/main/resources/application.yml的公共服务
  • service1具有src/main/resources/application.yml和自己的属性
我希望它们与优先的service1版本合并。相反,似乎只使用在类路径上找到的第一个


(或者,使用@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));
    }
}