Подтвердить что ты не робот

Как переопределить Spring -boot application.properties программно

У меня есть файлы свойств jdbc, которые я беру из веб-службы внешней конфигурации В spring загрузиться, чтобы установить реквизиты 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 -patch реквизита:

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

Ответ 1

Вы можете добавить дополнительные источники свойств в прослушиватель жизненного цикла, реагирующий на событие 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

Это сработало для меня, однако, вы немного ограничены тем, что вы можете сделать на этом этапе, поскольку это довольно рано на этапе запуска приложения, вам нужно найти способ получить нужные вам ценности, не полагаясь на других spring beans и т.д.

Ответ 2

Просто для того, чтобы предоставить другой вариант этого потока для справки, когда, когда я начал искать ответ для моего требования, это оказалось высоким в списке поиска, но не охватывало мой вариант использования.

Я искал программный набор загрузочного свойства spring при запуске, но без необходимости работать с различными файлами XML/Config, поддерживаемыми spring.

Самый простой способ - установить свойства во время определения 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);
    }
}

Ответ 4

Начиная с Spring Boot 2.0.X вы можете динамически переопределять отдельные свойства (например, в модульном тесте), используя комбинацию пользовательского ApplicationContextInitializer и аннотации ContextConfiguration.

import org.junit.Test;
import org.junit.runner.RunWith;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.PortTest.RandomPortInitailizer;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.context.support.TestPropertySourceUtils;
import org.springframework.util.SocketUtils;

import static org.assertj.core.api.Assertions.assertThat;

@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(initializers = RandomPortInitializer.class)
public class PortTest {
    @Autowired
    private SomeService service;

    @Test
    public void testName() throws Exception {
        System.out.println(this.service);
        assertThat(this.service.toString()).containsOnlyDigits();
    }

    @Configuration
    static class MyConfig {

        @Bean
        public SomeService someService(@Value("${my.random.port}") int port) {
            return new SomeService(port);
        }
    }

    static class SomeService {
        private final int port;

        public SomeService(int port) {
            this.port = port;
        }

        @Override
        public String toString() {
            return String.valueOf(this.port);
        }
    }

    public static class RandomPortInitializer
            implements ApplicationContextInitializer<ConfigurableApplicationContext> {

        @Override
        public void initialize(ConfigurableApplicationContext applicationContext) {
            int randomPort = SocketUtils.findAvailableTcpPort();
            TestPropertySourceUtils.addInlinedPropertiesToEnvironment(applicationContext,
                    "my.random.port=" + randomPort);
        }
    }
}

Ответ 5

С помощью этого метода в вашей конфигурации вы можете установить свойства по умолчанию.

@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Application.class)
              .properties("propertyKey=propertyValue");
}

Ответ 6

В папке META-INF создайте именно эти папки и файл: spring > партия > переопределение > данные источник 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>

или использовать jndi, как это в файле xml, для доступа к вашему внешнему файлу конфигурации, например, 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" />

Ответ 7

Таким образом, вы можете переопределить 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);

}

Ответ 8

Вот как вы можете установить свойства при запуске, если вы запускаете приложение весенней загрузки.

Самый простой способ - установить свойства еще до запуска приложения.

@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);
    }
}