我对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>


因此,我需要使用ProviderLifecycle完全初始化PropertySetter
并且该PropertySetter必须包含对与Lifecycle相同的Provider的引用。

当我将lifecyclepropertySetter定义为单例时,会引起很大的问题,因为
如果我创建多个Provider,则Provider类的所有实例共享相同的生命周期
和属性设置器,这打破了应用程序逻辑。

当我尝试将所有bean定义为原型时,ProviderPropertySetter中的生命周期不再相同=>例外。

我有一个解决方案:仅将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/

10-12 04:50