如何以编程方式覆盖Spring-boot application.properties

时间:2015-03-16 08:43:43

标签: spring spring-boot spring-batch spring-batch-admin

我有从外部配置web服务获取的jdbc属性文件 在spring boot中为了设置mysql道具,将它们添加到application.properties:

很容易
spring.datasource.url=jdbc:mysql://localhost/mydb
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

我怎样才能在我的应用程序中重写那些程序?

同样适用于Spring-batch道具:

database.driver=com.mysql.jdbc.Driver
database.url=jdbc:mysql://localhost/mydv
database.username=root
database.password=root

10 个答案:

答案 0 :(得分:42)

您可以在生命周期监听器中添加其他属性源,以响应ApplicationEnvironmentPrepared事件。

有些事情:

public class DatabasePropertiesListener implements ApplicationListener<ApplicationEnvironmentPreparedEvent> {
  public void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) {
    ConfigurableEnvironment environment = event.getEnvironment();
    Properties props = new Properties();
    props.put("spring.datasource.url", "<my value>");
    environment.getPropertySources().addFirst(new PropertiesPropertySource("myProps", props));
  }
}

然后在src / main / resources / META-INF / spring.factories中注册该类:

org.springframework.context.ApplicationListener=my.package.DatabasePropertiesListener

这对我有用,但是,你现在可以做的事情有点受限,因为它在应用程序启动阶段相当早,你必须找到一种方法来获取你需要的价值而不依赖其他春豆等。

答案 1 :(得分:24)

只是为这个帖子提供另一个选项供我参考,因为当我开始寻找我的要求的答案时,这在搜索列表中很高,但没有涵盖我的用例。

我希望在启动时以编程方式设置spring boot属性,但不需要使用spring支持的不同XML / Config文件。

最简单的方法是在定义SpringApplication时设置属性。下面的基本示例将tomcat端口设置为9999。

@SpringBootApplication
public class Demo40Application{

    public static void main(String[] args){
        SpringApplication application = new SpringApplication(Demo40Application.class);

        Properties properties = new Properties();
        properties.put("server.port", 9999);
        application.setDefaultProperties(properties);

        application.run(args);
    }
}

答案 2 :(得分:15)

答案 3 :(得分:2)

从Spring Boot 2.0.X开始,您可以结合使用自定义ApplicationContextInitializer和ContextConfiguration批注来动态覆盖单个属性(例如,在单元测试中)。

[

答案 4 :(得分:1)

在配置中使用此方法,您可以设置默认属性。

ggplot(mtcars) +
aes(x = cyl, y = mpg, fill = mpg < 34) +
geom_bar(stat = "identity")

答案 5 :(得分:1)

如果您正在运行Spring Boot应用程序,这是在启动过程中设置属性的方式。

最简单的方法是在启动应用之前设置属性。

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication application = new SpringApplication(Application.class);
        ConfigurableEnvironment env = new ConfigurableEnvironment();
        env.setActiveProfiles("whatever");

        Properties properties = new Properties();
        properties.put("server.port", 9999);
        env.getPropertySources()
            .addFirst(new PropertiesPropertySource("initProps", properties));

        application.setEnvironment(env);
        application.run(args);
    }
}

答案 6 :(得分:1)

如果出于测试目的需要执行此操作:从春季测试5.2.5开始,您可以使用@DynamicPropertySource

    @DynamicPropertySource
    static void setDynamicProperties(DynamicPropertyRegistry registry) {
        registry.add("some.property", () -> some.way().of(supplying).a(value) );
    }

优先于几乎所有其他提供属性的方式。但是,该方法必须是静态的。

答案 7 :(得分:0)

在META-INF文件夹下,准确创建此文件夹和文件: 弹簧&GT;批次&GT;倍率&GT;数据源的context.xml 并在您的xml文件中确保覆盖您想要的参数:

<bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="${loader.jdbc.driver}" />
    <property name="url" value="${loader.jdbc.url}" />
    <property name="username" value="${loader.jdbc.username}" />
    <property name="password" value="${loader.jdbc.password}" />
</bean>

<bean id="transactionManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>

或在xml文件中使用这样的jndi来访问外部配置文件,如catalina.properties

<jee:jndi-lookup id="dataSource"
    jndi-name="java:comp/env/jdbc/loader-batch-dataSource" lookup-on-startup="true"
    resource-ref="true" cache="true" />

答案 8 :(得分:0)

如果必须,可以通过编程方式覆盖application.properties。

public static void main(String[] args) {
    SpringApplication app = new SpringApplication(Restdemo1Application.class);
    app.setAdditionalProfiles("dev"); 
    // overrides "application.properties" with  "application-dev.properties"
    app.run(args);

}

答案 9 :(得分:0)

这可能非常简单:

@SpringBootApplication
public class SampleApplication {

  public static void main(String[] args) {
    new SpringApplicationBuilder(SampleApplication.class)
        .properties(props())
        .build()
        .run(args);
  }

  private static Properties props() {
    Properties properties = new Properties();
    properties.setProperty("MY_VAR", "IT WORKS");
    return properties;
  }
}

application.yml

test:
  prop: ${MY_VAR:default_value}