首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将原型bean的同一实例重用两次- Spring

将原型bean的同一实例重用两次- Spring
EN

Stack Overflow用户
提问于 2012-10-05 20:56:47
回答 1查看 1.8K关注 0票数 2

我在使用Spring时遇到了一个问题:我需要重复使用同一个bean实例两次,但不能让它成为单例。

下面是一个简短的ApplicationContext:

代码语言:javascript
运行
复制
<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>

因此,我需要在Provider中完全初始化LifecyclePropertySetter,并且这个PropertySetter必须包含对相同Lifecycle的引用,就像Provider一样。

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

当我尝试将所有=>定义为原型时,Provider中的生命周期和PropertySetter中的生命周期不再是相同的bean异常。

我有一个解决方案:只将Lifecycle传递给Provider,并在Provider java构造函数中创建PropertySetter (通过扩展Provider)。它工作得很好,但只在我的本地环境中。在产品代码中,我不能扩展3pty Provider类,所以我不能使用这个解决方案。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-05 21:45:38

您不需要扩展Provider。只需创建您自己的ProviderFactory,它将引用lifecycle并创建PropertySetter,然后创建Provider

代码语言:javascript
运行
复制
public class ProviderFactory {

  public static create(Lifecycle lc) {
    return new Provider(lc, new PropertySetter(lc));
  }
}

下面是Spring声明:

代码语言:javascript
运行
复制
<bean id="defaultProvider" scope="prototype" 
      class="a.b.c.ProviderFactory" factory-method="create">
    <constructor-arg ref="lifecycle" />
</bean>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12746740

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档