Java 如何";“白色标签”;春豆

Java 如何";“白色标签”;春豆,java,spring,Java,Spring,我们有一个白色标签的应用程序(一个应用程序支持多个客户的品牌体验)。我们希望能够加载组件的联合品牌版本,以支持每个客户的定制组件。例如: <!-- default service --> <bean id="service" class="com.blah.myService" primary="true"> <property name="myBean" ref="bean" /> </bean> <!-- custom service

我们有一个白色标签的应用程序(一个应用程序支持多个客户的品牌体验)。我们希望能够加载组件的联合品牌版本,以支持每个客户的定制组件。例如:

<!-- 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进行子类化,这对顶级bean是有效的,但是在spring的加载过程中,自动连接的协作器是连接和缓存的

例如,如果调用getBean(“服务”),我可以在自定义ApplicationContext中截获调用并返回服务_123,但“bean”属性使用缓存版本,不会再次调用getBean方法,因此我无法连接自定义版本


有没有一种简单的方法可以实现这种类型的运行时自定义注入?

首先,您可能不需要子类
ApplicationContext
来实现这种自定义实例化逻辑-您可以创建一个
BeanPostProcessor


要解决缓存版本bean的问题,可以使用AOP或手动(例如,请参阅及其子类)将返回的bean包装到某种代理中。

一种方法是手动加载这些bean:

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

如果您需要您的类访问ApplicationContext的实例,请让您的类实现ApplicationContextAware。

听起来这在spring概要文件中是可行的

你会有一个配置文件,每个客户都有一个特殊的bean。 加上默认客户的配置文件


虽然用例完全不同,但应该让您开始使用概要文件。

这适用于选择顶级bean,但所有依赖项都将在加载时连接,因此不支持通过添加CoBrandTargetSource进行“cobranding”,我能够在运行时连接依赖项,但是顶级bean的选择没有参与(通过BeanPostProcessor或TargetSource)。你有办法解决这个问题吗?你的答案正好相反。beans配置是每个应用还是全部?它们一起在一个应用下