Spring创建新对象但不应该

时间:2011-05-03 15:19:40

标签: java spring caching

我遇到了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都以某种方式抓住了可能非常愚蠢的相同资源,或者可以告诉我什么是正确的?

3 个答案:

答案 0 :(得分:2)

我怀疑Spring正在创建新的HashMaps。您的配置看起来不错。我很确定你的逻辑中有问题。

在标有

的部分
// ... code for retrieving the object from the DB

您实际上是将检索到的值写入地图吗?

答案 1 :(得分:2)

也许并发会弄乱你的地图。您不希望将HashMap用作单例,因为它不是线程安全的。请尝试使用ConcurrentHashMap

答案 2 :(得分:1)

配置看起来很好,Spring在这方面经过了很好的测试,所以我认为不会有任何意外。

每次尝试访问bean时,您是否有可能创建Spring上下文?从而重复重复所有事情。