2012-07-19 28 views
0

我需要共享静态hashmaps,它将在运行时使用Spring 3.1进行初始化。如何创建将容纳静态哈希映射的“Singleton”Bean

我需要创建一个真正的单例bean(不一定是单例范围),它将保存我所有的静态hashmaps。

哈希映射也可以在运行时修改,它必须可用于我所有的spring bean。

  1. 持有的静态地图具有与应用程序运行
  2. 的bean是只要活着豆需要所有的Spring bean来访问。
  3. hashmaps需要并发和线程安全。哈希映射可能有100个条目,并且将以非常高的速率访问。

我怎么能实现这个?在此先感谢,

+2

正常的单例作用域bean持有ConcurrentHashMaps的问题是什么?为什么地图必须是静态的? – Kevin 2012-07-19 15:24:38

+0

正常的singleton bean没有问题,除非事实上,只要我的应用程序存在,我就需要这个bean存活。 – rayman 2012-07-22 07:27:02

+0

“一个真正的单身bean”是否意味着持久的数据存储(在服务器关闭和启动数据被记住之后)或者在服务器启动后创建新的hashmap?如果是第二种情况,单身人士范围是完全正确的。 – Xaerxess 2012-07-24 17:23:46

回答

0

我不是100%意识到您的需要,但您可以创建自己的范围3.5.5 Custom scopes,这将确保纯单身实例和可注射到所有的豆。并可能是你可以通过适当的同步方法或地图解决线程安全

+0

无法创建一个纯的单例实例注入能够不使用自定义范围?这是不是有点开销? – rayman 2012-07-22 07:31:32

+0

为什么你认为这可能是开销? – 2012-07-23 05:25:37

+0

因为我确定已经有了一种可以使bean成为单例并且可以全局访问的范围。这是框架中非常常见的功能。 – rayman 2012-07-23 07:58:46

1

我同意@凯文的评论(ConcurrentHashMap豆),但刚刚发现不错的弹簧3.1加法:ConcurrentMapCacheFactoryBean。该文档说:

FactoryBeanConcurrentMapCache的易配置的Spring容器内使用 时。

我也this blog post发现,其中提出使用bean与@Cacheable注释:

<bean id="cacheManager" 
     class="org.springframework.cache.support.SimpleCacheManager"> 
    <property name="caches"> 
     <set> 
      <bean class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean" 
        p:name="default"/> 
     </set> 
    </property> 
</bean> 

还没有尝试过,但似乎很好地集成与Spring的东西。

+0

但为什么我需要在这里缓存?只需要一个可以修改静态访问数据的单例。 – rayman 2012-07-22 07:28:20