1

我有一个java类,可以说'class1',它基本上包含一个ConcurrentHashMap(用作缓存)和一些更新和删除映射中条目的函数。这个类不是设计为单例类。我正在与一位同事讨论,但由于我在互联网上阅读了几篇帖子,我无法真正决定。我问是否可以这样做-

<bean id="reqrespCacheMgr1" class="gravity.applications.RFQService.reqrespgtwy.utility.ReqRespCacheManager" scope="singleton">
    </bean>
<bean id="reqrespCacheMgr2" class="gravity.applications.RFQService.reqrespgtwy.utility.ReqRespCacheManager" scope="singleton">
    </bean>
<bean id="reqrespCacheMgr3" class="gravity.applications.RFQService.reqrespgtwy.utility.ReqRespCacheManager" scope="singleton">
    </bean>

我基本上是在尝试创建同一个类的 3 个单例实例。我认为它并没有真正破坏单例的含义,因为我们谈论的是 spring bean 工厂上下文中的单例范围,而不是类加载器上下文。我知道有其他方法可以做到这一点。就像在同一个类中有 3 个并发哈希映射并且只使用一个单例 bean 引用,通过尝试为同一个类中的 3 个映射创建更新和删除方法。

我希望我没有把它弄糊涂,但我只想知道哪种方法好。我担心我对设计模式的使用不当..

如果问题不清楚,请告诉我

4

2 回答 2

1

看来您不需要单例,而是原型

<bean id="reqrespCacheMgr" class="gravity.applications.RFQService.reqrespgtwy.utility.ReqRespCacheManager" scope="prototype" />

class B1 {
   @Autowire
   ReqRespCacheManager cacheManager;
}

class B2 {
   @Autowire
   ReqRespCacheManager cacheManager;
}

class B3 {
   @Autowire
   ReqRespCacheManager cacheManager;
}

所有 3 个 bean 都将获得一个新的 ReqRespCacheManager 实例

于 2013-05-08T22:13:40.610 回答
0

在我看来没问题,只要您只需要在应用程序的整个生命周期中使用这 3 个实例即可。您是否知道自动装配单个属性不适用于这种类型?您将需要使用 @Qualifier 将特定实例分配给您的应用程序 bean:

public class FooBean {
   @Inject
   @Qualifier("reqrespCacheMgr3")
   ReqRespCacheManager cacheManager;
}

或者,您可以通过注入您类型的 List 组件将所有三个集合到一个 bean 中。

@Inject
List<ReqRespCacheManager> caches;

希望有帮助!祝你好运,别忘了提前两步。

于 2013-05-08T22:08:24.790 回答