2012-03-17 42 views

回答

3

这里没有魔法,当销毁BeanFactory/ApplicationContext时调用销毁回调函数(调用close()方法)。在桌面应用程序中,这必须手动完成,在servlet环境中,用于启动应用程序上下文的相同机制(通常为ContextLoaderListener)被处理为您销毁。

有两点需要注意:

  • 销毁是需要的对象重要的明确清理比如数据库连接池(DataSource)或线程。

  • 豆被破坏以相反的顺序相比,创建顺序。这是可以理解的:当豆A取决于B时,B必须先创建。当豆A被销毁时,B必须被销毁,否则A将无法​​在销毁阶段访问其依赖关系。

此外Spring还允许您自动注册shutdown hook以自动处理关闭。我不会建议,但只是为了记录:

ConfigurableApplicationContext ctx = new ClassPathXmlApplicationContext(...) 
ctx.registerShutdownHook(); 
+0

啊,所以如果你不调用关闭的BeanFactory/ApplicationContext这不会导致事件被触发? – LuckyLuke 2012-03-17 18:21:15

+0

@Viper nope,正如我所说的,这里没有魔法。如果您明确创建了应用程序上下文,则必须显式关闭它。另外Spring不会调用'prototype'作用域bean的生命周期回调函数 - 因为它在创建和初始化后没有跟踪它们 – 2012-03-17 18:23:28

+0

我认为你误解了这个注释,那就是我所说的:如果你不关闭它不会调用销毁生命周期回调。无论如何,谢谢你:) – LuckyLuke 2012-03-17 18:28:10

0

这取决于你的环境中,如果你在一个Web应用程序运行的,春天是“已确定”一旦你的servlet上下文被破坏,因此它可以告诉所有的这是他们将要被销毁的对象。

BTW,临春2.5是真的老了,你应该抓住一个新的书,因为有很多的东西,2.5和3.x系列之间变化。