我有一个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个映射创建更新和删除方法。
我希望我没有让它变得混乱,但我想知道的是哪种方法很好。我担心我会不正当地使用设计模式..
如果问题不清楚,请告诉我
答案 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;
希望有所帮助!祝你好运,不要忘记提前两步。