我有一个多线程应用程序,我正在尝试用 Spring 编写,现在我在我的 bean 上使用新的线程范围声明并将相同的上下文传递给Runnable类。线程工作正常,我得到了每个线程的 DAO/服务的新副本,这正是我想要的。
尽管我认为在这种情况下我会遇到内存问题,因为这些线程可以无限期地产生,但是使用ClassPathXmlApplicationContext创建一个全新的ApplicationContext很慢,有没有办法制作上下文的深层副本,所以它不需要从头开始重新加载?
我有一个多线程应用程序,我正在尝试用 Spring 编写,现在我在我的 bean 上使用新的线程范围声明并将相同的上下文传递给Runnable类。线程工作正常,我得到了每个线程的 DAO/服务的新副本,这正是我想要的。
尽管我认为在这种情况下我会遇到内存问题,因为这些线程可以无限期地产生,但是使用ClassPathXmlApplicationContext创建一个全新的ApplicationContext很慢,有没有办法制作上下文的深层副本,所以它不需要从头开始重新加载?
不要使用线程范围 bean,而是使用单例范围 bean。这是默认行为,因此您不必做任何特别的事情——即不要指定范围。如果您已经添加了自定义线程范围,则只需删除配置的该部分。
在应用程序关闭之前,不需要关闭包含单例范围 bean 的上下文。以下是如何进行干净关机。
克隆 an 的整个理想ApplicationContext
是朝错误方向迈出的一步。您真的应该只考虑 Spring 管理的 bean 的生命周期。换句话说,通常您的应用程序不应该知道或关心 . ApplicationContext
,而应该只依赖 Spring IoC 正常工作。所以,你原来的问题从“我如何创建一个新的ApplicationContext
?”改变了。到“如何获得对正确 Spring 管理 bean 的引用”?此外,如果您克隆了ApplicationContext
,那么您可能会破坏 Spring 的 IoC 容器的合同(例如,创建应该是单例的数据库连接池的多个实例),并且没有其他人能够弄清楚发生了什么!