我遇到了Spring的以下问题:我希望单例创建一次,然后从Spring缓存中引用。但事实似乎并非如此。我在beans.xml中有以下几行:
<bean id="Cache" class="java.util.HashMap" scope="singleton" >
</bean>
在下面引用如下:
<bean id="ManuallyCachingDAO" class="blah"
scope="singleton" init-method="init" destroy-method="destroy">
<property name="cache" ref="Cache"></property>
...
并在ManuallyCachingDAO代码:
public Object get(int id) {
Object o = cache.get(id);
if (o != null) {
return o;
}
// ... code for retrieving the object from the DB
}
但HashMap
有时会以神秘的方式清空!也就是说,我认为它实际上并没有被清空。我认为当我在另一个类中引用ManuallyCachingDAO
时,它会被删除并重新创建。
你能告诉我如何解决这个问题吗?
编辑:在Robin的提示:我做了以下操作来获取很多课程中的bean(不是全部):
ClassPathResource blah = etc.;
XmlBeanFactory xbf = new XmlBeanFactory(blah);
...
xbf.getBean("Cache");
...现在我正在做这件事(即使是很多其他的豆子)...这是一个非常愚蠢或非常糟糕的想法,或两者兼而有之?我认为现在我发现我做错了...直到现在,我只是怀疑所有XmlBeanFactories都以某种方式抓住了可能非常愚蠢的相同资源,或者可以告诉我什么是正确的?
答案 0 :(得分:2)
我怀疑Spring正在创建新的HashMaps。您的配置看起来不错。我很确定你的逻辑中有问题。
在标有
的部分// ... code for retrieving the object from the DB
您实际上是将检索到的值写入地图吗?
答案 1 :(得分:2)
也许并发会弄乱你的地图。您不希望将HashMap用作单例,因为它不是线程安全的。请尝试使用ConcurrentHashMap。
答案 2 :(得分:1)
配置看起来很好,Spring在这方面经过了很好的测试,所以我认为不会有任何意外。
每次尝试访问bean时,您是否有可能创建Spring上下文?从而重复重复所有事情。