복붙노트

[SPRING] 프로그래밍 방식으로 Spring 부팅 application.properties를 무시하는 방법

SPRING

프로그래밍 방식으로 Spring 부팅 application.properties를 무시하는 방법

외부 구성 웹 서비스에서 가져 오는 jdbc 등록 정보 파일이 있습니다. 스프링 부트에서는 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 배치 소품에도 동일하게 적용됩니다.

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

해결법

  1. ==============================

    1.ApplicationEnvironmentPrepared 이벤트에 반응하는 라이프 사이클 리스너에 추가 속성 소스를 추가 할 수 있습니다.

    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
    

    이것은 나에게 도움이되었지만, 애플리케이션 시작 단계에서 상당히 초기 단계이므로 지금 할 수있는 일은 제한적입니다. 다른 스프링에 의존하지 않고 필요한 값을 얻을 수있는 방법을 찾아야합니다. 콩 등

  2. ==============================

    2.이 요구 사항에 대한 답변을 찾기 시작했을 때 참조 용으로이 스레드에 또 다른 옵션을 제공하기 만하면 검색 목록에 올랐지 만 사용 사례는 다루지 않았습니다.

    이 요구 사항에 대한 답변을 찾기 시작했을 때 참조 용으로이 스레드에 또 다른 옵션을 제공하기 만하면 검색 목록에 올랐지 만 사용 사례는 다루지 않았습니다.

    시작시 스프링 부트 속성을 프로그래밍 방식으로 설정하려고했지만 스프링이 지원하는 다른 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);
        }
    }
    
  3. ==============================

    3.봄 부팅 1.3 EnvironmentPostProcessor이 목적을 위해 사용할 수 있습니다. 그것의 서브 클래스를 만들고 META-INF / spring.factories에 등록하십시오. 좋은 예가 여기 있습니다 :

    봄 부팅 1.3 EnvironmentPostProcessor이 목적을 위해 사용할 수 있습니다. 그것의 서브 클래스를 만들고 META-INF / spring.factories에 등록하십시오. 좋은 예가 여기 있습니다 :

    https://github.com/spring-cloud/spring-cloud-sleuth/blob/48f3f9783f277a795d0210399f0ea09b7f1a4e71/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/autoconfig/TraceEnvironmentPostProcessor.java

  4. ==============================

    4.구성에이 메서드를 사용하면 기본 속성을 설정할 수 있습니다.

    구성에이 메서드를 사용하면 기본 속성을 설정할 수 있습니다.

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

    5.Spring Boot 2.0.X에서는 사용자 정의 ApplicationContextInitializer와 ContextConfiguration 주석을 조합하여 개별 속성 (예 : 단위 테스트)을 동적으로 재정의 할 수 있습니다.

    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);
            }
        }
    }
    
  6. ==============================

    6.META-INF 폴더 아래에 정확히이 폴더와 파일을 만듭니다. spring> batch> override> data-source-context.xml XML 파일에서 다음과 같이 원하는 매개 변수를 재정의해야합니다.

    META-INF 폴더 아래에 정확히이 폴더와 파일을 만듭니다. spring> batch> override> data-source-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" />
    
  7. ==============================

    7.이것이 필요한 경우 program.properties를 프로그램 방식으로 재정의하는 방법입니다.

    이것이 필요한 경우 program.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. from https://stackoverflow.com/questions/29072628/how-to-override-spring-boot-application-properties-programmatically by cc-by-sa and MIT license