복붙노트

[SPRING] Spring XML 컨텍스트에서 조건부 리소스 가져 오기를 수행하는 방법?

SPRING

Spring XML 컨텍스트에서 조건부 리소스 가져 오기를 수행하는 방법?

달성하고자하는 것은 자식 스프링 XML 컨텍스트의 가져 오기를 활성화 / 비활성화하는 "동적"(즉 구성 파일에 정의 된 속성 기반) 기능입니다.

나는 다음과 같은 것을 상상한다.

<import condition="some.property.name" resource="some-context.xml"/>

속성이 해결 된 곳 (부울) 및 true이면 컨텍스트를 가져오고, 그렇지 않은 경우 컨텍스트를 가져옵니다.

일부는 내 연구 지금까지 :

해결법

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

    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. ==============================

    2.표준 Spring 컴포넌트를 사용하여 가장 가까운 것은 :

    표준 Spring 컴포넌트를 사용하여 가장 가까운 것은 :

    <import resource="Whatever-${yyzzy}.xml"/>
    

    여기서 $ {xyzzy}는 시스템 특성에서 특성을 보간합니다. (로드 프로세스를 시작하기 전에 다른 장소의 속성을 시스템 속성 객체에 추가하는 컨텍스트 로더 클래스의 해킹 된 사용자 정의 버전을 사용합니다.)

    그러나 많은 불필요한 것들을 가져 오는 것으로도 벗어날 수 있습니다 ... 그리고 다양한 트릭을 사용하여 필요한 bean을 인스턴스화 할 수 있습니다. 이러한 트릭에는 다음이 포함됩니다.

  3. ==============================

    3.Spring 3.1.x에서는 빈 프로파일을 사용하여 조건부 자원 가져 오기 및 빈 인스턴스화를 수행 할 수 있습니다. 이전 버전을 사용하고 있다면 이것은 도움이되지 않습니다. :)

    Spring 3.1.x에서는 빈 프로파일을 사용하여 조건부 자원 가져 오기 및 빈 인스턴스화를 수행 할 수 있습니다. 이전 버전을 사용하고 있다면 이것은 도움이되지 않습니다. :)

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

    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. ==============================

    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. ==============================

    6.또 다른 옵션은 앱이 / conf 폴더에있는 modules-config.xml 파일을로드하고 설치 / 구성 단계에서 편집하여로드하려는 모듈의 주석을 제거하는 것입니다.

    또 다른 옵션은 앱이 / conf 폴더에있는 modules-config.xml 파일을로드하고 설치 / 구성 단계에서 편집하여로드하려는 모듈의 주석을 제거하는 것입니다.

    이것은 다른 통합 모듈을위한 컨테이너 역할을하는 웹 애플리케이션에서 사용하고있는 솔루션입니다. 웹 응용 프로그램은 모든 다른 통합 모듈과 함께 배포됩니다. modules-config.xml은 tomcat의 / conf 폴더에 있고 conf 폴더는 classpath에 추가됩니다 (catalina.properties / common.loader 속성을 통해). 내 웹 응용 프로그램 webapp-config.xml에는로드 할 수 있도록 이 있습니다.

  7. ==============================

    7.Spring 3.0을 고려해야 할 또 다른 사항 :

    Spring 3.0을 고려해야 할 또 다른 사항 :

     <alias name="Whatever" alias=""Whatever-${yyzzy}" />
    

    여기서 $ {xyzzy}는 시스템 특성에서 특성을 보간합니다.

  8. ==============================

    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}" /> 
    

    이것이 도움이되기를 바랍니다.

  9. from https://stackoverflow.com/questions/3035630/how-to-achieve-conditional-resource-import-in-a-spring-xml-context by cc-by-sa and MIT license