[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.나는 @ 크리스천의 @Autowired 대답이 좋은 것 같아요. 그 유형의 빈이 사용 가능한 경우 setter 메소드가 호출됩니다. 그러나 동일한 유형의 빈이 여러 개있는 경우 Spring에서 예외가 발생한다고 생각합니다. 이 같은 이유로 또는 @Autowired를 사용할 수없는 경우 몇 가지 해결책이 있습니다.
나는 @ 크리스천의 @Autowired 대답이 좋은 것 같아요. 그 유형의 빈이 사용 가능한 경우 setter 메소드가 호출됩니다. 그러나 동일한 유형의 빈이 여러 개있는 경우 Spring에서 예외가 발생한다고 생각합니다. 이 같은 이유로 또는 @Autowired를 사용할 수없는 경우 몇 가지 해결책이 있습니다.
행운을 빕니다.
-
==============================
2.내 가장 좋은 추측은 autowire-ing을 필수 false로 사용하는 것입니다. XML로 이것을 어떻게 표현할 수 있는지 모르겠지만 주석 구성을 사용하면 다음과 같이 보입니다.
내 가장 좋은 추측은 autowire-ing을 필수 false로 사용하는 것입니다. XML로 이것을 어떻게 표현할 수 있는지 모르겠지만 주석 구성을 사용하면 다음과 같이 보입니다.
@Autowired(required=false)
-
==============================
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.XML 설정의 빈 참조가 표현 언어 (EL)를 통해 정의되면 다음을 수행 할 수 있습니다.
XML 설정의 빈 참조가 표현 언어 (EL)를 통해 정의되면 다음을 수행 할 수 있습니다.
<property name="cache" value="#{getObject('optionalCache')}" />
BeanExpressionContext.getObject () 메소드를 사용합니다. 자세한 내용은 여기를 참조하십시오.
-
==============================
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>
from https://stackoverflow.com/questions/3957430/optional-spring-bean-references by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 누락 된 이슈 javax.transaction : jta : jar : 1.0.1B (해상도가 다를 수 있으므로 문제가 다름) (0) | 2019.01.20 |
---|---|
[SPRING] 최대 절전 모드에서 날짜를 비교하는 방법 (0) | 2019.01.20 |
[SPRING] java.lang.IncompatibleClassChangeError : Mongo 클래스 구현 (0) | 2019.01.20 |
[SPRING] java.lang.ClassNotFoundException : org.hibernate.ejb.HibernatePersistence (0) | 2019.01.20 |
[SPRING] {}가있는 Spring MVC @Path 변수 (0) | 2019.01.20 |