Java Spring会创建新对象,但不应创建新对象

Java Spring会创建新对象,但不应创建新对象,java,spring,caching,Java,Spring,Caching,我对Spring有以下问题:我希望单例会被创建一次,然后从Spring缓存中引用。但事实似乎并非如此。我的beans.xml中有以下几行: <bean id="Cache" class="java.util.HashMap" scope="singleton" > </bean> 但是,HashMap有时会以神秘的方式清空!也就是说,我不认为它实际上是空的。我想当我在另一个类中引用ManuallyCachingDAO时,它被删除并重新创建 你能告诉我怎么解决这个问题吗

我对Spring有以下问题:我希望单例会被创建一次,然后从Spring缓存中引用。但事实似乎并非如此。我的beans.xml中有以下几行:

<bean id="Cache" class="java.util.HashMap" scope="singleton" >
</bean>
但是,
HashMap
有时会以神秘的方式清空!也就是说,我不认为它实际上是空的。我想当我在另一个类中引用
ManuallyCachingDAO
时,它被删除并重新创建

你能告诉我怎么解决这个问题吗

编辑:根据Robin的提示:我执行以下操作以在许多类中获取bean(但不是全部):


。。。现在我正在做这件事(即使对很多其他豆子来说)。。。这是一个非常愚蠢或非常糟糕的主意,还是两者兼而有之?我想我现在意识到我做错了什么。。。到目前为止,我只是怀疑所有XMLBeanFactory都以某种方式获取了相同的资源,这可能确实非常愚蠢,或者s/o能告诉我什么是正确的吗?

我怀疑Spring是否正在创建新的哈希映射。您的配置看起来正常。我敢肯定你的逻辑有问题

在标记的部分

// ... code for retrieving the object from the DB

您真的将检索到的值写入映射吗?

我怀疑Spring是否正在创建新的哈希映射。您的配置看起来正常。我敢肯定你的逻辑有问题

在标记的部分

// ... code for retrieving the object from the DB

您真的将检索到的值写入映射吗?

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


您是否会在每次尝试访问bean时都创建Spring上下文?因此,可以重复创建所有内容。

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


您是否会在每次尝试访问bean时都创建Spring上下文?因此,重复地重新创建所有内容。

可能并发正在破坏您的地图。您不希望将HashMap用作单例,因为它不是线程安全的。试着改用。

可能并发性把你的地图弄乱了。您不希望将HashMap用作单例,因为它不是线程安全的。尝试改用。

请展示init()方法。您应该证明您认为正在发生的事情实际上正在发生。使用调试器或System.out查看对“singleton”的引用是否实际更改。当很容易确定的时候,不确定意味着你可能在白费力气。试着检查映射的哈希代码,看看它是否是同一个实例。您的配置似乎没有任何问题。哦,作为补充说明。您很可能不想在这里使用HashMap。如果有多个线程正在访问此缓存,则会出现同步问题。我建议使用ConcurrentHashMap。请显示init()方法。您应该证明您认为正在发生的事情实际上正在发生。使用调试器或System.out查看对“singleton”的引用是否实际更改。当很容易确定的时候,不确定意味着你可能在白费力气。试着检查映射的哈希代码,看看它是否是同一个实例。您的配置似乎没有任何问题。哦,作为补充说明。您很可能不想在这里使用HashMap。如果有多个线程正在访问此缓存,则会出现同步问题。我建议使用ConcurrentHashMap。ConcurrentHashMap为+1,尽管我确信这不是OP问题的原因,这不是问题,但感谢您的提示,我竖起大拇指+1表示ConcurrentHashMap,尽管我确信这不是OP问题的原因,这不是问题,但感谢您的提示,我竖起大拇指,你的意思是我不能在每个类中都不执行以下操作:“ClassPathResource blah=etc;XmlBeanFactory xbf=newxmlbeanfactory(blah);xbf.getBean(“缓存”);”。。。因为现在我正在做。。。这是一个愚蠢的主意还是一个坏主意?你的意思是我不能在每个类中都不执行以下操作:“ClassPathResource blah=etc;XmlBeanFactory xbf=newxmlbeanFactory(blah);xbf.getBean(“缓存”);”。。。因为现在我正在做。。。这是个愚蠢的主意还是个坏主意?
ClassPathResource blah = etc.; 
XmlBeanFactory xbf = new XmlBeanFactory(blah); 
...
xbf.getBean("Cache");
// ... code for retrieving the object from the DB