복붙노트

[SPRING] bean이 존재할 때만 주입하는 방법

SPRING

bean이 존재할 때만 주입하는 방법

다음과 같은 스프링 컨텍스트 파일 구조가 있습니다 (->는 'includes'를 의미합니다).

A1.xml -> B.xml & C.xml
A2.xml -> B.xml

C.xml은 bean c를 정의합니다.

B.xml은 c에 종속 된 bean b를 정의합니다.

컨텍스트 A2에 정의 된 c가 없으므로 분명히 A2에 대해 실패합니다.

어떻게하면 좋을지 지정할 수 있습니다 : 문맥 안에 c가 있다면 b에 넣습니다. 그렇지 않으면 그냥 null을 주입합니까?

나는 봄 EL을 들여다 보았다.

<property name="b" ref="#{ @c?:null}" />

그냥 b.toString ()의 값인 것처럼 보이는 NoSuchBeanDefinitionException을 내게주었습니다!

Btw : 나는이 물건이 지옥처럼 지저분하고 가능한 한 빨리 청소해야한다는 것을 이미 알고있다.

해결법

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

    1.SpEL 표현식의 #root 객체는 BeanExpressionContext이므로 해당 컨텍스트에서 getObject () 메서드를 호출 할 수 있습니다. 빈이 선언되지 않으면 null을 리턴한다.

    SpEL 표현식의 #root 객체는 BeanExpressionContext이므로 해당 컨텍스트에서 getObject () 메서드를 호출 할 수 있습니다. 빈이 선언되지 않으면 null을 리턴한다.

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

    참고 : bean 정의가 아닌 bean을 반환하기 때문에 not ref 값을 사용합니다.

    getObject ()의 코드는 다음과 같습니다.

    public Object getObject(String key) {
        if (this.beanFactory.containsBean(key)) {
            return this.beanFactory.getBean(key);
        }
        else if (this.scope != null){
            return this.scope.resolveContextualObject(key);
        }
        else {
            return null;
        }
    }
    
  2. ==============================

    2.나는 XML을 정리하는 것에 매우 동의한다 :-)

    나는 XML을 정리하는 것에 매우 동의한다 :-)

    특수 효과 기반 주입을 사용하는 경우이 트릭을 시도해 볼 수 있습니다.

    @Autowired( required=false )
    

    나는 이것이 당신의 상황에서 효과가 있을지 확신 할 수 없지만, 시도해 볼만한 가치가 있습니다.

  3. from https://stackoverflow.com/questions/13084229/how-to-inject-a-bean-only-when-it-exists by cc-by-sa and MIT license