저는 특정 빈이 존재하면 목표 빈에 주입 할 수 있도록 XML을 통해 Spring을 설정하고 싶습니다. 존재하지 않으면 다른 기본 빈이 삽입됩니다. 예를 들어스프링 3 : 다른 콩이없는 한 기본 빈을 넣으십시오.
나는이
<bean id="carDriver" class="Driver">
<property name="car" value="SOME EXPRESSION GOES HERE, SEE ATTEMPT BELOW"/>
</bean>
<bead id="defaultCar" class="Car">
<property name="name" value="Honda Accord"/>
</bean>
같은 파일이 그리고 그것을로드하는 경우, 나는 드라이버에 주입 된 defaultCar
을하고 싶습니다. 나는 또한 다음과 같은 파일을로드 할 경우, :
<bean id="customCar" class="FlyingCar">
<property name="name" value="Rocket Car"/>
<property name="maxAltitude" value="80000"/>
</bean>
나는 customCar
콩 대신 defaultCar
콩의 사용하고자하는 것입니다. 내 초기 시도가 작동하지 않습니다,하지만 난 달성하기 위해 노력하고있어 설명 생각 : 나는 PropertyPlaceholderConfigurer
이 작업을 수행하는 방법을 알고
<bean id="carDriver" class="Driver">
<property name="car" value="#{ @customCar eq null ? 'defaultCar' : 'customCar' }"/>
</bean>
,하지만 난하지 않으려는 속성 파일을 제공해야합니다/VM 프로퍼티/환경 변수 등을 포함 할 수있다. 감사!
는 업데이트 : "공장 콩을 사용하여"의견을 바탕으로
, 나는이 들여다 다음과 같은 솔루션을 함께했다. 첫째, 난 당신이 기본 빈 이름과 재정의 콩 이름을 지정할 수있는 일반 공장 콩 만든 :
public class DefaultOverrideFactoryBean implements FactoryBean, BeanFactoryAware {
public Object getObject() throws Exception {
return beanFactory.containsBean(overrideBeanName) ?
beanFactory.getBean(overrideBeanName) :
beanFactory.getBean(defaultBeanName);
}
public Class<?> getObjectType() {
return Object.class;
}
public boolean isSingleton() {
return true;
}
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.beanFactory = beanFactory;
}
public void setDefaultBeanName(String defaultBeanName) {
this.defaultBeanName = defaultBeanName;
}
public void setOverrideBeanName(String overrideBeanName) {
this.overrideBeanName = overrideBeanName;
}
private String defaultBeanName;
private String overrideBeanName;
private BeanFactory beanFactory;
}
내 예를 들어 자동차 드라이버를 구성하기를, 당신은이 작업을 수행 할 것입니다 :
<bean id="carDriver" class="Driver">
<property name="car">
<bean class="DefaultOverrideFactoryBean">
<property name="defaultBeanName" value="defaultCar"/>
<property name="overrideBeanName" value="customCar"/>
</bean>
</property>
</bean>
I을 SpEL을 사용하는 것이 더 좋았지 만 이것이 효과적입니다. 아마도 사용자 정의 스키마 요소를 추가하면이 클리너가 만들어집니다.
추가 의견 감사합니다.
FactoryCar bean을 생성하지 않는 이유는 무엇입니까? 그런 다음 carDriver 내의 해당 팩토리를 참조하십시오. – chris