[SPRING] bean이 존재할 때만 주입하는 방법
SPRINGbean이 존재할 때만 주입하는 방법
다음과 같은 스프링 컨텍스트 파일 구조가 있습니다 (->는 '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.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.나는 XML을 정리하는 것에 매우 동의한다 :-)
나는 XML을 정리하는 것에 매우 동의한다 :-)
특수 효과 기반 주입을 사용하는 경우이 트릭을 시도해 볼 수 있습니다.
@Autowired( required=false )
나는 이것이 당신의 상황에서 효과가 있을지 확신 할 수 없지만, 시도해 볼만한 가치가 있습니다.
from https://stackoverflow.com/questions/13084229/how-to-inject-a-bean-only-when-it-exists by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring-boot : 찾을 수없는 'entityManagerFactory'라는 이름의 bean이 필요합니다. (0) | 2019.07.17 |
---|---|
[SPRING] Spring @Async : LAZY 콜렉션의 null 동면 세션 (0) | 2019.07.17 |
[SPRING] Spring 5 - 정적 자원을 제공하는 방법 (0) | 2019.07.17 |
[SPRING] Spring 데이터 수신 REST URL에서 작동하지 않는 Spring 인터셉터 (0) | 2019.07.17 |
[SPRING] 스프링 4와 함께 webSocket 서버에서 연결 이벤트를 캡처하는 방법은 무엇입니까? (0) | 2019.07.17 |