重用原型bean的同一个实例两次 - 春天(Reuse same instance of proto

2019-08-01 04:36发布

我和春天有个问题:我需要重用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>

所以,我需要有完全初始化ProviderLifecyclePropertySetter内,这PropertySetter必须包含参照相同的Lifecycle ,为Provider有。

当我定义lifecyclepropertySetter为单身,它会导致大问题,因为如果我创建一个以上的Provider ,在所有情况下, Provider类股相同的生命周期和属性setter,并且它打破应用程序逻辑。

当我尝试定义所有的bean作为原型,在生命周期ProviderPropertySetter是不一样=>例外一次。

我有一个解决办法:要传递给ProviderLifecycle和创造PropertySetterProvider的Java构造函数(通过扩展Provider )。 它运作良好,但只是在我的本地环境。 在生产代码,我不能扩展3PTY Provider一流的,所以我不能使用此解决方案。

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

Answer 1:

你并不需要延长Provider 。 只要创建自己的ProviderFactory ,将采取参考lifecycle ,并创造PropertySetter然后Provider

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>


文章来源: Reuse same instance of prototype bean twice - Spring