我在使用Spring时遇到了一个问题:我需要重复使用同一个bean实例两次,但不能让它成为单例。
下面是一个简短的ApplicationContext:
<bean class="a.b.c.Provider" id="defaultProvider" scope="prototype">
<constructor-arg ref="lifecycle" />
<constructor-arg ref="propertySetter" />
</bean>
<bean name="lifecycle" class="a.b.c.Lifecycle" scope="prototype">
<constructor-arg ref="someParam" />
... and more args
</bean>
<bean id="propertySetter" class="a.b.c.PropertySetter" scope="prototype">
<constructor-arg ref="lifecycle" />
</bean>
因此,我需要在Provider
中完全初始化Lifecycle
和PropertySetter
,并且这个PropertySetter
必须包含对相同Lifecycle
的引用,就像Provider
一样。
当我将lifecycle
和propertySetter
定义为单例时,会产生很大的问题,因为如果我创建多个Provider
,Provider
类的所有实例都共享相同的生命周期和属性设置器,这会破坏应用程序逻辑。
当我尝试将所有=>定义为原型时,Provider
中的生命周期和PropertySetter
中的生命周期不再是相同的bean异常。
我有一个解决方案:只将Lifecycle
传递给Provider
,并在Provider
java构造函数中创建PropertySetter
(通过扩展Provider
)。它工作得很好,但只在我的本地环境中。在产品代码中,我不能扩展3pty Provider
类,所以我不能使用这个解决方案。
请告诉我,在这种情况下,最合适的做法是什么?
发布于 2012-10-05 21:45:38
您不需要扩展Provider
。只需创建您自己的ProviderFactory
,它将引用lifecycle
并创建PropertySetter
,然后创建Provider
public class ProviderFactory {
public static create(Lifecycle lc) {
return new Provider(lc, new PropertySetter(lc));
}
}
下面是Spring声明:
<bean id="defaultProvider" scope="prototype"
class="a.b.c.ProviderFactory" factory-method="create">
<constructor-arg ref="lifecycle" />
</bean>
https://stackoverflow.com/questions/12746740
复制相似问题