我对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
类的所有实例共享相同的生命周期和属性设置器,这打破了应用程序逻辑。
当我尝试将所有bean定义为原型时,
Provider
和PropertySetter
中的生命周期不再相同=>例外。我有一个解决方案:仅将
Provider
传递给Lifecycle
并在PropertySetter
java构造函数中创建Provider
(通过扩展Provider
)。它运行良好,但仅在我的本地环境中有效。在生产代码中,我无法扩展3pty
Provider
类,因此无法使用此解决方案。请告诉我,在这种情况下最适合做什么?
最佳答案
您不需要扩展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>
关于java - 两次重用原型(prototype)bean的同一实例-Spring,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12746740/