2012-10-05 32 views
2

我有一个Spring问题:我需要重复使用同一个bean实例两次,但不要使它成为单例。重复使用原型bean的同一个实例两次 - Spring

这里是一个简短的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> 

所以,我需要与LifecyclePropertySetter内, 已经完全初始化ProviderPropertySetter必须包含相同的Lifecycle参考,为Provider有。

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

当我尝试将所有bean定义为原型时,ProviderPropertySetter中的生命周期再次出现异常=>异常。

我有一个解决办法:传递给ProviderLifecycle并创建PropertySetter内部Provider java的构造(由延伸Provider)。 它运转良好,但只在我的当地环境中。在生产代码中,我无法扩展3pty Provider类,所以我不能使用此解决方案。

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

+0

* *为什么你需要做到这一点? –

+0

@DaveNewton我需要这样做是因为需求。这是一个复杂应用程序的小设计不好的插件,我不能重新设计它。 – WinnieRazor

回答

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> 
+0

谢谢!我通过这种方式实施了我的修复。来自俄罗斯的问候:) – WinnieRazor

相关问题