引用同一个类的多个单例bean

时间:2013-05-08 21:50:50

标签: java spring singleton inversion-of-control

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

<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个映射创建更新和删除方法。

我希望我没有让它变得混乱,但我想知道的是哪种方法很好。我担心我会不正当地使用设计模式..

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

2 个答案:

答案 0 :(得分: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的新实例

答案 1 :(得分:0)

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

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

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

@Inject
List<ReqRespCacheManager> caches;

希望有所帮助!祝你好运,不要忘记提前两步。