我是Spring框架的新手。我对Spring中的singleton概念感到困惑,它是垃圾收集。我已经阅读了很多问题和文章来解答我的问题: Spring Singleton范围是如何被垃圾收集的。我只得到了关于原型范围垃圾收集的答案,但关于单例范围的文章对我来说并不清楚。有人可以提供有关此问题的详细信息。
答案 0 :(得分:6)
在Spring,你写的大多数课程都是单身。这意味着只创建了这些类的一个实例。这些类是在Spring容器启动时创建的,并在Spring容器停止时被销毁。
Spring单例对象与简单Java对象的不同之处在于容器维护对它们的引用,并且它们可以随时在代码中的任何位置使用。
我将给你一个使用Spring容器来说明我的意思的例子。这是 NOT 在编写Spring应用程序时应该如何正常执行此操作,这只是一个示例。
@Component
public class ExampleClass implements ApplicationContextAware {
/*
* The ApplicationContextAware interface is a special interface that allows
* a class to hook into Spring's Application Context. It should not be used all
* over the place, because Spring provides better ways to get at your beans
*/
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
MyBean bean = applicationContext.getBean("MyBean");
}
}
以上代码的作用是对Spring"我想要在容器启动时发现的MyBean实例" (Classpath Scanning)。 Spring应该已经创建了这个类的(代理)实例,可供您使用。
Spring IoC容器只创建该bean定义定义的对象的一个实例。这个单实例存储在这种单例bean的缓存中,该命名bean的所有后续请求和引用都返回缓存对象。
由于该bean已缓存在应用程序上下文中,因此在销毁应用程序上下文之前,它永远不能进行垃圾收集。
答案 1 :(得分:0)
这似乎并非完全正确。我们有一个企业级Spring应用程序,拥有接近12000个singlton类。如果JVM(无论应用程序服务器如何)以大约4GB的堆启动,则堆将填充大约3个重新部署,甚至取消部署和部署。即使没有其他活动,部署也是如此。堆转储也恰好显示了3个单例副本。因此,它实际上并没有因应用程序上下文而被破坏。我们一直在寻找解决方案,但没有成功,因为这对于开发人员来说是浪费大量时间。他们经常在调试或测试时浪费大量时间来回收应用服务器。在使用weblogic的情况下,即使只是停止并启动应用程序几次,也会发生这种情况。