[SPRING] Spring XML 컨텍스트에서 조건부 리소스 가져 오기를 수행하는 방법?
SPRINGSpring XML 컨텍스트에서 조건부 리소스 가져 오기를 수행하는 방법?
달성하고자하는 것은 자식 스프링 XML 컨텍스트의 가져 오기를 활성화 / 비활성화하는 "동적"(즉 구성 파일에 정의 된 속성 기반) 기능입니다.
나는 다음과 같은 것을 상상한다.
<import condition="some.property.name" resource="some-context.xml"/>
속성이 해결 된 곳 (부울) 및 true이면 컨텍스트를 가져오고, 그렇지 않은 경우 컨텍스트를 가져옵니다.
일부는 내 연구 지금까지 :
해결법
-
==============================
1.이제 스프링 4를 사용하여 완전히 가능합니다.
이제 스프링 4를 사용하여 완전히 가능합니다.
기본 애플리케이션 콘텐츠 파일
<bean class="com.example.MyConditionalConfiguration"/>
MyConditionalConfiguration은 다음과 같습니다.
@Configuration @Conditional(MyConditionalConfiguration.Condition.class) @ImportResource("/com/example/context-fragment.xml") public class MyConditionalConfiguration { static class Condition implements ConfigurationCondition { @Override public ConfigurationPhase getConfigurationPhase() { return ConfigurationPhase.PARSE_CONFIGURATION; } @Override public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { // only load context-fragment.xml if the system property is defined return System.getProperty("com.example.context-fragment") != null; } } }
마지막으로 /com/example/context-fragment.xml에 포함 할 빈 정의를 넣습니다.
@Conditional에 대한 JavaDoc보기
-
==============================
2.표준 Spring 컴포넌트를 사용하여 가장 가까운 것은 :
표준 Spring 컴포넌트를 사용하여 가장 가까운 것은 :
<import resource="Whatever-${yyzzy}.xml"/>
여기서 $ {xyzzy}는 시스템 특성에서 특성을 보간합니다. (로드 프로세스를 시작하기 전에 다른 장소의 속성을 시스템 속성 객체에 추가하는 컨텍스트 로더 클래스의 해킹 된 사용자 정의 버전을 사용합니다.)
그러나 많은 불필요한 것들을 가져 오는 것으로도 벗어날 수 있습니다 ... 그리고 다양한 트릭을 사용하여 필요한 bean을 인스턴스화 할 수 있습니다. 이러한 트릭에는 다음이 포함됩니다.
-
==============================
3.Spring 3.1.x에서는 빈 프로파일을 사용하여 조건부 자원 가져 오기 및 빈 인스턴스화를 수행 할 수 있습니다. 이전 버전을 사용하고 있다면 이것은 도움이되지 않습니다. :)
Spring 3.1.x에서는 빈 프로파일을 사용하여 조건부 자원 가져 오기 및 빈 인스턴스화를 수행 할 수 있습니다. 이전 버전을 사용하고 있다면 이것은 도움이되지 않습니다. :)
-
==============================
4.앞서 언급했듯이, Spring 3.1 이상을 사용하고 있다면 프로파일로 쉽게 수행 할 수있다.
앞서 언급했듯이, Spring 3.1 이상을 사용하고 있다면 프로파일로 쉽게 수행 할 수있다.
<!-- default configuration - will be loaded if no profile is specified --> <!-- This will only work if it's put at the end of the configuration file --> <!-- so no bean definitions after that --> <beans profile="default"> <import resource="classpath:default.xml" /> </beans> <!-- some other profile --> <beans profile="otherProfile"> <import resource="classpath:other-profile.xml" /> </beans>
otherProfile은 예를 들어
mvn install -Dspring.profiles.active=otherProfile
테스트에서 다른 프로파일을 사용하는 경우 -DforkMode = never를 추가하여 테스트가 동일한 VM 내에서 실행되도록해야하므로 param spring.profiles.active가 손실되지 않습니다.
-
==============================
5.기록을 위해 Robert Maldon은이 게시물에서 bean의 조건부 정의를 수행하는 방법을 설명합니다. http://robertmaldon.blogspot.com/2007/04/conditionally-defining-spring-beans.html. 여기에 복사하는 데 약간 시간이 걸립니다 (게다가, 필자는 어쨌든 그의 기사를 복사하여 붙여 넣어야한다고 생각하지 않습니다).
기록을 위해 Robert Maldon은이 게시물에서 bean의 조건부 정의를 수행하는 방법을 설명합니다. http://robertmaldon.blogspot.com/2007/04/conditionally-defining-spring-beans.html. 여기에 복사하는 데 약간 시간이 걸립니다 (게다가, 필자는 어쨌든 그의 기사를 복사하여 붙여 넣어야한다고 생각하지 않습니다).
귀하의 예에 적합한이 접근법의 최종 결과는 다음과 같습니다.
<condbean:cond test="${some.property.name}"> <import resource="some-context.xml"/> </condbean:cond>
물론 Stephen C의 솔루션만큼 간단하지는 않지만 훨씬 강력합니다.
-
==============================
6.또 다른 옵션은 앱이 / conf 폴더에있는 modules-config.xml 파일을로드하고 설치 / 구성 단계에서 편집하여로드하려는 모듈의 주석을 제거하는 것입니다.
또 다른 옵션은 앱이 / conf 폴더에있는 modules-config.xml 파일을로드하고 설치 / 구성 단계에서 편집하여로드하려는 모듈의 주석을 제거하는 것입니다.
이것은 다른 통합 모듈을위한 컨테이너 역할을하는 웹 애플리케이션에서 사용하고있는 솔루션입니다. 웹 응용 프로그램은 모든 다른 통합 모듈과 함께 배포됩니다. modules-config.xml은 tomcat의 / conf 폴더에 있고 conf 폴더는 classpath에 추가됩니다 (catalina.properties / common.loader 속성을 통해). 내 웹 응용 프로그램 webapp-config.xml에는로드 할 수 있도록
이 있습니다. -
==============================
7.Spring 3.0을 고려해야 할 또 다른 사항 :
Spring 3.0을 고려해야 할 또 다른 사항 :
<alias name="Whatever" alias=""Whatever-${yyzzy}" />
여기서 $ {xyzzy}는 시스템 특성에서 특성을 보간합니다.
-
==============================
8.당신 자신의 ContextLoaderListener에서 contextInitialized (javax.servlet.ServletContextEvent 이벤트)를 오버라이드하고 super.contextInitialized (event)가 호출되기 전에 필수 System 속성을 설정할 수 있습니다.
당신 자신의 ContextLoaderListener에서 contextInitialized (javax.servlet.ServletContextEvent 이벤트)를 오버라이드하고 super.contextInitialized (event)가 호출되기 전에 필수 System 속성을 설정할 수 있습니다.
package com.mypackage; import org.springframework.web.context.ContextLoaderListener; public class MyContextLoaderListener extends ContextLoaderListener { public void contextInitialized(javax.servlet.ServletContextEvent event) { System.setProperty("xyz", "import-file-name.xml"); super.contextInitialized(event); } }
그리고 web.xml의 ContextLoaderListener를 MyContextLoaderListener로 바꾸십시오.
<listener> <listener-class>com.mypackage.MyContextLoaderListener</listener-class> </listener>
이제 spring.xml에서 사용할 수 있습니다.
<import resource="${xyz}" />
이것이 도움이되기를 바랍니다.
from https://stackoverflow.com/questions/3035630/how-to-achieve-conditional-resource-import-in-a-spring-xml-context by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 서비스 계층 및 컨트롤러 : 누가 처리합니까? (0) | 2018.12.08 |
---|---|
[SPRING] Spring Boot에서 암시 적으로 사용하는 Jackson JSON 매퍼를 사용자 정의하는 방법은 무엇입니까? (0) | 2018.12.08 |
[SPRING] JPA EntityListener에 Spring 의존성 삽입하기 (0) | 2018.12.08 |
[SPRING] DispatcherServlet이 다른 응용 프로그램 컨텍스트를 만드는 이유는 무엇입니까? (0) | 2018.12.08 |
[SPRING] "NoClassDefFoundError : 클래스를 초기화 할 수 없습니다"오류 (0) | 2018.12.08 |