2010-01-22 4 views
4

우리는 흰색으로 표시된 응용 프로그램 (여러 고객에게 브랜드 경험을 지원하는 하나의 응용 프로그램)이 있습니다. 고객 당 맞춤 구성 요소를 지원하기 위해 공동 브랜드 버전의 구성 요소를로드 할 수 있기를 원합니다. 예를 들어, 뭔가 같은 :봄 콩을 "화이트 라벨"하는 방법

<!-- default service --> 
<bean id="service" class="com.blah.myService" primary="true"> 
    <property name="myBean" ref="bean" /> 
</bean> 
<!-- custom service for client 123 --> 
<bean id="service_123" class="com.blah.myService"> 
    <property name="myBean" ref="bean" /> 
</bean> 

<!-- default bean --> 
<bean id="bean" class="com.blah.Bean" primary="true"/> 
<!-- bean for client 123 --> 
<bean id="bean_123" class="com.blah.Bean" /> 

우리는 ApplicationContext를 서브 클래 싱 시도, 이것은 최상위 콩을 위해 작동하지만 autowire가 공동 작업자 봄의로드하는 동안 유선 및 캐시됩니다.

예를 들어, getBean ("service")을 호출하면 내 사용자 지정 ApplicationContext에서 호출을 가로 채서 service_123을 반환 할 수 있지만 "bean"속성은 캐시 된 버전을 사용하고 getBean 메서드를 다시 호출하지 않습니다. 따라서 사용자 지정 버전에서 연결할 수 없습니다.

이 유형의 런타임 사용자 정의 주입을 쉽게 수행 할 수 있습니까?

+0

빈 구성은 앱당 또는 모두입니까? –

+0

그들은 하나의 응용 프로그램 아래 함께 있습니다 –

답변

1

우선이 유형의 사용자 정의 인스턴스 작성 논리를 구현하기 위해 ApplicationContext의 서브 클래스를 작성할 필요가 없으므로 대신 BeanPostProcessor을 작성할 수 있습니다.

캐시 된 버전의 문제점을 해결하기 위해 AOP 또는 수동 (예 : TargetSource 및 그 하위 클래스 참조)을 사용하여 리턴 된 bean을 일종의 프록시로 랩핑 할 수 있습니다. 이 수동으로 콩을로드 할 것

+0

CoBrandTargetSource를 추가함으로써 런타임에 종속성을 연결할 수 있었지만 최상위 레벨 Bean의 선택이 BeanPostProcessor 또는 TargetSource를 통해 참여하지 않았습니다. 이 문제를 해결할 생각이 있습니까? 귀하의 대답은 그렇지 않은 부분에 있습니다. –

0

한 가지 방법 :

당신의 ApplicationContext의 인스턴스에 액세스하는 클래스가 필요한 경우
myAppContext.getBean("bean_" + customer.getId()); 

, 당신의 클래스가 ApplicationContextAware를 구현합니다.

+0

이것은 최상위 빈을 선택하는데 사용되지만, 모든 의존성은로드시 유선 상태가되어 "cobranding"을 지원하지 않습니다. –

1

이와 같은 사운드는 스프링 프로파일로 처리 할 수 ​​있습니다.

고객마다 특별 콩을 사용하는 프로필이 있습니다. 기본 고객 프로필.

This article은 유스 케이스가 완전히 다르지만 프로필로 시작해야합니다.