복붙노트

[SPRING] 선택적 스프링 빈 참조

SPRING

선택적 스프링 빈 참조

내 응용 프로그램에서는 ContextLoaderListener를 사용하여 많은 jar에서 컨텍스트 파일을로드합니다.

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath*:META-INF/contextBeans.xml</param-value>
</context-param>

즉, 가져 오기를 수행하지 않고 다른 jar에서 bean을 참조 할 수 있습니다.

응용 프로그램에는 여러 배포 옵션이 있으며 일부 배포에는 jar를 제외 할 수 있습니다. 이를 지원하기 위해 일부 빈 참조를 선택적으로 원합니다. 예 :

<bean id="mainAppBean" class="com.someapp.MyApplication">
    <constructor-arg index="0" ref="localBean"/>
     <constructor-arg index="1" ref="optionalBeanReference1"/>
    <constructor-arg index="2" ref="optionalBeanReference2"/>
 </bean>

위의 예제에서는 참조를 찾을 수없는 경우 optionalBeanReference1을 null로 설정하고 싶습니다 (어떤 방식 으로든 선택적으로 표시).

이것이 봄에 할 수 있습니까? 동적 참조를 처리 할 때 어떤 방법을 권장합니까?

해결법

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

    1.나는 @ 크리스천의 @Autowired 대답이 좋은 것 같아요. 그 유형의 빈이 사용 가능한 경우 setter 메소드가 호출됩니다. 그러나 동일한 유형의 빈이 여러 개있는 경우 Spring에서 예외가 발생한다고 생각합니다. 이 같은 이유로 또는 @Autowired를 사용할 수없는 경우 몇 가지 해결책이 있습니다.

    나는 @ 크리스천의 @Autowired 대답이 좋은 것 같아요. 그 유형의 빈이 사용 가능한 경우 setter 메소드가 호출됩니다. 그러나 동일한 유형의 빈이 여러 개있는 경우 Spring에서 예외가 발생한다고 생각합니다. 이 같은 이유로 또는 @Autowired를 사용할 수없는 경우 몇 가지 해결책이 있습니다.

    행운을 빕니다.

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

    2.내 가장 좋은 추측은 autowire-ing을 필수 false로 사용하는 것입니다. XML로 이것을 어떻게 표현할 수 있는지 모르겠지만 주석 구성을 사용하면 다음과 같이 보입니다.

    내 가장 좋은 추측은 autowire-ing을 필수 false로 사용하는 것입니다. XML로 이것을 어떻게 표현할 수 있는지 모르겠지만 주석 구성을 사용하면 다음과 같이 보입니다.

    @Autowired(required=false)
    
  3. ==============================

    3.최신 버전의 Spring (Spring 4.1에서 테스트 됨)과 Java Configuration 및 Java 8을 사용하면 매개 변수에서 Optional을 사용할 수 있으며 사용 가능한 경우 자동 실행됩니다.

    최신 버전의 Spring (Spring 4.1에서 테스트 됨)과 Java Configuration 및 Java 8을 사용하면 매개 변수에서 Optional을 사용할 수 있으며 사용 가능한 경우 자동 실행됩니다.

    @Autowired
    public MyApplication(Optional<YourOptionalObject> maybeObject) {
        // do something with the optional autowired
    }
    
  4. ==============================

    4.XML 설정의 빈 참조가 표현 언어 (EL)를 통해 정의되면 다음을 수행 할 수 있습니다.

    XML 설정의 빈 참조가 표현 언어 (EL)를 통해 정의되면 다음을 수행 할 수 있습니다.

    <property name="cache" value="#{getObject('optionalCache')}" />
    

    BeanExpressionContext.getObject () 메소드를 사용합니다. 자세한 내용은 여기를 참조하십시오.

  5. ==============================

    5.이를 위해 기본 제공되는 메커니즘이 없습니다. 그러나 다음과 같이 FactoryBean 구현을 작성할 수 있습니다.

    이를 위해 기본 제공되는 메커니즘이 없습니다. 그러나 다음과 같이 FactoryBean 구현을 작성할 수 있습니다.

    public class OptionalFactoryBean extends AbstractFactoryBean<Object> implements BeanNameAware {
    
        private String beanName;
    
        @Override
        public void setBeanName(String beanName) {
            this.beanName = BeanFactoryUtils.originalBeanName(beanName);
    
        }
    
        @Override
        protected Object createInstance() throws Exception {
            if (getBeanFactory().containsBean(beanName)) {
                return getBeanFactory().getBean(beanName);
            } else {
                return null;
            }
        }
    
        @Override
        public Class<?> getObjectType() {
            return null;
        }
    }
    

    다음과 같이 사용할 수 있습니다.

    <bean id="mainAppBean" class="com.someapp.MyApplication">
        <constructor-arg index="0" ref="localBean"/>    
        <constructor-arg index="1">
           <bean name="optionalBeanReference1" class="com.someapp.OptionalBeanFactory"/>
        </constructor-arg>
        <constructor-arg index="2">
           <bean name="optionalBeanReference2" class="com.someapp.OptionalBeanFactory"/>
        </constructor-arg>
    </bean>
    
  6. from https://stackoverflow.com/questions/3957430/optional-spring-bean-references by cc-by-sa and MIT license