Java 重复使用同一个原型bean实例两次-Spring
Spring有一个问题:我需要重复使用同一个bean实例两次,但不能使其成为单例 下面是一个简短的应用程序上下文:Java 重复使用同一个原型bean实例两次-Spring,java,spring,inversion-of-control,Java,Spring,Inversion Of Control,Spring有一个问题:我需要重复使用同一个bean实例两次,但不能使其成为单例 下面是一个简短的应用程序上下文: <bean class="a.b.c.Provider" id="defaultProvider" scope="prototype"> <constructor-arg ref="lifecycle" /> <constructor-arg ref="propertySetter" /> </bean> <b
<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>
... 还有更多的args
因此,我需要使用Lifecycle
和PropertySetter
对Provider
进行完全初始化,
此属性设置
必须包含对生命周期
的引用,就像提供程序
所具有的一样
当我将lifecycle
和propertySetter
定义为单例时,它会导致很大的问题,因为
如果我创建多个提供程序
,则提供程序
类的所有实例共享相同的生命周期
和属性设置器,它破坏了应用程序逻辑
当我尝试将所有bean定义为原型时,Provider
和PropertySetter
中的生命周期也不是相同的=>异常
我有一个解决方案:只传递给Provider
生命周期Lifecycle
并在Provider
内部创建PropertySetter
(通过扩展Provider
)。
它工作得很好,但只在我当地的环境中。在生产代码中,我无法扩展3ptyProvider
class,因此无法使用此解决方案
请告诉我,在这种情况下最适合做什么?您不需要扩展
提供程序。只需创建您自己的提供程序工厂
,该工厂将引用生命周期
,并将创建属性设置
,然后创建提供程序
:
public class ProviderFactory {
public static create(Lifecycle lc) {
return new Provider(lc, new PropertySetter(lc));
}
}
以下是春季宣言:
<bean id="defaultProvider" scope="prototype"
class="a.b.c.ProviderFactory" factory-method="create">
<constructor-arg ref="lifecycle" />
</bean>
为什么需要这样做?@DaveNewton我需要这样做是因为需要。这是一个设计不好的复杂应用程序插件,我不能重新设计它。谢谢!我已经用这种方式实现了我的修复。俄罗斯的问候:)