如何“白标”春豆

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

<!-- 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(“service”),我可以在我的自定义ApplicationContext中拦截调用并返回service_123,但“bean”属性使用缓存版本并且不再调用getBean方法,因此我无法连接自定义版本.

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

最佳答案 首先,您可能不需要继承ApplicationContext来实现这种自定义实例化逻辑 – 您可以创建一个BeanPostProcessor.

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

点赞