我有一个多线程应用程序我试图用Spring编写,现在我在我的bean上使用新的线程范围声明并将相同的上下文传递给 Runnable < / strong>上课。线程工作正常,我为每个线程获得了DAO / Services的新副本,所以我想要它。
虽然我认为在这种情况下我会遇到内存问题,因为这些线程可以无限生成,但是使用 ClassPathXmlApplicationContext 创建一个全新的 ApplicationContext 很慢,是否有如何制作上下文的深层副本,以便不需要从头开始重新加载?
答案 0 :(得分:3)
使用singleton scope beans而不是使用线程范围bean。这是默认行为,因此您不必执行任何特殊操作 - 即不指定范围。如果您已经添加了自定义线程范围,那么只需删除配置中的那部分。
在应用程序关闭之前,不需要关闭包含单例作用域bean的上下文。 Here是如何彻底关闭的。
克隆ApplicationContext
的整个理想是向错误方向迈出的一步。你真的应该只考虑Spring管理的bean的生命周期。换句话说,通常您的应用程序不应该知道或关心ApplicationContext
,而应该依赖Spring IoC正常工作。因此,您的原始问题会更改为“如何创建新的ApplicationContext
?” “如何获得对正确的Spring托管bean的引用”?此外,如果您克隆ApplicationContext
,那么您可能违反了Spring的IoC容器的合同(例如,创建一个应该是单例的数据库连接池的多个实例),并且没有其他人能够弄清楚什么是继续!