现在我的项目是基于struts2+spring2.0+hibernate3
在Spring配置时将Action的Scpoe配置成prototype,因为Action对象的创建是由Struts2委托给Spring的,这将导致Spring为每个请求都创建一个ActionBean。而我看到很多博客里都这么写,要把Action配置成prototype。
但问题是,我在看spring文档是,看到这一句话[color=red]“清除prototype作用域的对象并释放任何prototype bean所持有的昂贵资源,都是客户端代码的职责。”[/color]
我就想问一下,什么叫“[color=red]清除prototype作用域的对象并释放任何prototype bean所持有的昂贵资源[/color]”?我又怎样在客户端代码完成清除prototype作用域的对象并释放任何prototype bean所持有的昂贵资源?
希望大家能为我答疑解惑
[quote]清除prototype作用域的对象并释放任何prototype bean所持有的昂贵资源,都是客户端代码的职责[/quote]
注意断句
清除 [color=red]prototype作用域的对象[/color] 并释放 [color=red]任何prototype bean所持有的昂贵资源[/color],都是客户端代码的职责
对这个prototype应该明白吧,不明白看看设计模式中的原型模式,简单理解为[color=red]copy对象[/color]。
看懂断句后的话,先理解一下“客户端代码的职责”,这里的“客户端代码”是针对spring框架而言的,就是指用spring做应用的程序员写的代码。OK。
清除 [color=red]prototype作用域的对象[/color]:这个JVM可以帮我们做到(比如程序运行退出了对象作用域)。
释放 [color=red]任何prototype bean所持有的昂贵资源[/color] :这个我们首先代码释放,比如使用了文件流后close文件流,打开了连接后close等等。
bean是由spring创建的,那么清除和释放资源也应该由spring来做,你的客户端不用维护。“prototype”范围的bean因为每次使用都要创建,对spring来说开销是大了。
[quote]释放 任何prototype bean所持有的昂贵资源 :这个我们首先代码释放,比如使用了文件流后close文件流,打开了连接后close等等。[/quote]
这些资源的释放即使我们写普通的类,处理问题时也会这么做,也不是特别针对“prototype”的bean的啊。而且,怎么保证“prototype”的bean释放前一定释放了这些资源呢,每次使用时记得释放吗?
[b]理解Bean的销毁两种方式:[/b]
1、使用配置文件中的 destory-method 属性
与初始化属性 init-methods类似,在Bean的类中实现一个撤销Bean的方法,然后在配置文件中通过 destory-method指定,那么当bean销毁时,Spring将自动调用指定的销毁方法。
2、实现 org.springframwork.bean.factory.DisposebleBean接口
[quote]怎么保证“prototype”的bean释放前一定释放了这些资源呢,每次使用时记得释放吗?[/quote]
程序员必须有的好习惯,使用了有限的资源必须记得释放。
@Anddy
[quote]Thus, although initialization lifecycle callback methods are called on all objects regardless of scope, in the case of prototypes, configured destruction lifecycle callbacks are not called. [/quote]
这是spring Reference 里的一段,任何作用域的对象的“initialization ”回调都会执行,而对“prototype”作用域的对象“[b][color=darkred]configured destruction[/color][/b]”回调不会执行,这里的“[b][color=darkred]configured destruction[/color][/b]”是不是指你上面提到的第一种还是两种都是?