[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.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.이 요구 사항에 대한 답변을 찾기 시작했을 때 참조 용으로이 스레드에 또 다른 옵션을 제공하기 만하면 검색 목록에 올랐지 만 사용 사례는 다루지 않았습니다.
이 요구 사항에 대한 답변을 찾기 시작했을 때 참조 용으로이 스레드에 또 다른 옵션을 제공하기 만하면 검색 목록에 올랐지 만 사용 사례는 다루지 않았습니다.
시작시 스프링 부트 속성을 프로그래밍 방식으로 설정하려고했지만 스프링이 지원하는 다른 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.봄 부팅 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.구성에이 메서드를 사용하면 기본 속성을 설정할 수 있습니다.
구성에이 메서드를 사용하면 기본 속성을 설정할 수 있습니다.
@Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(Application.class) .properties("propertyKey=propertyValue"); }
-
==============================
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.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.이것이 필요한 경우 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); }
from https://stackoverflow.com/questions/29072628/how-to-override-spring-boot-application-properties-programmatically by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] POJO 클래스에서 Servlet Request 객체 가져 오기 (0) | 2019.01.27 |
---|---|
[SPRING] MongoDB 용 Spring 데이터 MongoDB와 Hibernate OGM의 차이점은 무엇입니까? (0) | 2019.01.27 |
[SPRING] persistence.xml과 스프링 설정 파일의 데이터 소스 설정의 차이점 (0) | 2019.01.27 |
[SPRING] 거기에 예외가 발생하지 않고 트랜잭션 롤백을 강제하는 방법이 있습니까? (0) | 2019.01.27 |
[SPRING] 스프링 데이터의 이해 JPA @NoRepositoryBean 인터페이스 (0) | 2019.01.27 |