Java 重复使用同一个原型bean实例两次-Spring

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

Spring有一个问题:我需要重复使用同一个bean实例两次,但不能使其成为单例

下面是一个简短的应用程序上下文:

<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
)。 它工作得很好,但只在我当地的环境中。在生产代码中,我无法扩展3pty
Provider
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我需要这样做是因为需要。这是一个设计不好的复杂应用程序插件,我不能重新设计它。谢谢!我已经用这种方式实现了我的修复。俄罗斯的问候:)