Spring IOC产生对象的生命周期

Spring IOC产生对象的生命周期

1、HelloWorld在默认的配置情况下是单例的。
验证过程:1、创建HelloWorld类
2、把该类放入到spring容器中
3、启动调用

将来在做项目的时候,会把service层和dao层所有的类放入到spring容器中,service层所有的类和dao层所有的类都是单例的,不能一个对象放在属性上(因为是共享的)

2、多例,需要配置scope

1
<bean id="helloWorld" class="..." scope="prototype"></bean>

singleton:单例(默认)
prototype:多例
request:每一次HTTP请求产生一个新的bean,同时该bean仅在当前HTTP request内有效
session:每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP session内有效
global session:每一次HTTP请求都会产生一个新的bean,同时该bean全局HTTP session内有效

singleton:
返回单例的对象,只会初始化一次

prototype:
每次都会new一个对象返回,也就是多例的,另外对于prototype作用域的bean,有一点非常重要,那就是Spring不能对一个prototype bean的整个生命周期负责,容器在初始化、配置、装饰或者是装配完一个prototype实例后,将它交给客户端,随后就对该prototype实例不闻不问了。不管何种作用域,容器都会调用所有对象的初始化生命周期回调方法,而对prototype而言,任何配置好的析构生命周期回调方法都将不会被调用。 清除prototype作用域的对象并释放任何prototype bean所持有的昂贵资源,都是客户端代码的职责。(让Spring容器释放被singleton作用域bean占用资源的一种可行方式是,通过使用 bean的后置处理器,该处理器持有要被清除的bean的引用。)

singleton和prototype二者选择的原则:有状态的bean都使用Prototype作用域,而对无状态的bean则应该使用singleton作用域。

因为stuts2中的action是多例的,所以将来struts2中的action要放入spring容器中也是多例的