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, и это работает для компонента верхнего уровня, но autowired сотрудники подключаются и кэшируются во время загрузки весной.

В качестве примера, если я вызываю getBean («service»), я могу перехватить вызов в своем пользовательском ApplicationContext и вернуть service_123, но свойство «bean» использует кешированную версию и не вызывает метод getBean еще раз, поэтому я не могу подключиться к пользовательской версии.

Есть ли простой способ достичь этого типа пользовательской инъекции времени выполнения?

+0

Конфигурация боба для каждого приложения или все вместе? –

+0

Они находятся под одним приложением –

ответ

1

Прежде всего, вам, возможно, не нужен подкласс ApplicationContext, чтобы реализовать подобную логику создания экземпляров - вместо этого вы можете создать BeanPostProcessor.

Чтобы решить проблему с кешированной версией компонента, вы можете обернуть возвращаемый компонент в какой-либо прокси-сервер, используя AOP или вручную (например, см. TargetSource и его подклассы).

+0

Добавив источник CoBrandTargetSource, я смог связать зависимости во время выполнения, но выбор компонента верхнего уровня не участвовал (либо через BeanPostProcessor, либо TargetSource). У вас есть идея решить эту проблему? В противном случае ваш ответ будет точным. –

0

Одним из способов было бы вручную загружаются эти бобы:

myAppContext.getBean("bean_" + customer.getId()); 

Если вам нужен класс для доступа к экземпляр ApplicationContext, сделать класс реализации ApplicationContextAware.

+0

Это работает для выбора компонента верхнего уровня, но все зависимости будут связаны проводными во время загрузки и, таким образом, не будут поддерживать «совместный», –

1

Звучит так, что это возможно с пружинными профилями.

У вас будет профиль для каждого клиента со специальными бобами. Плюс профиль для клиентов по умолчанию.

This article должен начать работать с профилями, хотя прецедент полностью отличается.

Смежные вопросы