2

我对 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并且PropertySetterPropertySetter必须包含对相同的引用Lifecycle,就像Provider有一样。

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

当我尝试将所有 bean 定义为原型时,生命周期 inProvider和 inPropertySetter又不相同 => 异常。

Provider我有一个解决方案:仅传递给LifecyclePropertySetterProviderjava 构造函数中创建(通过扩展Provider)。它运行良好,但仅在我的本地环境中。在生产代码中我不能扩展 3ptyProvider类,所以我不能使用这个解决方案。

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

4

1 回答 1

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>
于 2012-10-05T13:45:37.750 回答