我们有一个白色标签应用程序(一个应用程序支持多个客户的品牌体验).我们希望能够加载组件的联合品牌版本,以支持每个客户的自定义组件.例如:
<!-- 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
及其子类).