重复使用原型bean的相同实例两次 - Spring

时间:2012-10-05 12:56:47

标签: java spring inversion-of-control

我遇到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中的生命周期不一样=&gt;再次例外。

我有一个解决方案:仅传递Provider Lifecycle并在PropertySetter java构造函数中创建Provider(通过扩展Provider)。 它运作良好,但仅限于我当地的环境。在生产代码中,我无法扩展3pty Provider类,因此我无法使用此解决方案。

请告诉我,在这种情况下最适合做什么?

1 个答案:

答案 0 :(得分:1)

您无需延长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>