Spring:bean的作用域(singleton & Prototype )

bean的作用域:

一. singleton : 在每个Spring IoC容器中一个bean定义对应一个对象实例。

           当一个bean的作用域为singleton, 那么Spring IoC容器中只会存在一个共享的bean实例,并且所有对bean的

     请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。换言之,当把一个bean定义设置为singlton作用域 

     时,Spring IoC容器只会创建该bean定义的唯一实例。这个单一实例会被存储到单例缓存(singleton cache)中,并

    且所有针对该bean的后续请求和引用都将返回被缓存的对象实例。

           Singleton作用域是Spring中的缺省作用域。

    例:要在XML中要将bean定义成singleton,可以这样配置:

      (1) 默认时就为singleton:<bean id="xxx" class="XXX.XXX.XXX"/> 

      (2) 通过指定设置为singleton:

                 <bean id="xxx" class="XXX.XXX.XXX" scope="singleton"/>

           或者

                 <bean id="xxx" class="XXX.XXX.XXX"  singleton="true"/>

二. Prototype

          Prototype作用域的bean会导致在每次对该bean请求(将其注入到另一个bean中,或者以程序的方式调用容器

    的getBean()方法)时都会创建一个新的bean实例。根据经验,对有状态的bean应该使用prototype作用域, 而对无

    状态的bean则应该使用singleton作用域。

          通常情况下,DAO不会被配置成prototype,因为DAO通常不会持有任何会话状态,因此应该使用singleton作用

    域。

          要在XML中将bean定义成prototype,可以这样配置:

          <bean id="xxx" class="XXX.XXX.XXX" scope="prototype"/>

           对于prototype作用域的bean,有一点非常重要,那就是Spring不能对一个prototype bean的整个生命周期负

    责:容器在初始化、配置、装饰或者是装配完一个prototype实例后,将它交给客户端,随后就对该prototype实例不闻不 

    问了。不管何种作用域,容器都会调用所有对象的初始化生命周期回调方法。但对prototype而言,任何配置好的析构生

    命周期回调方法都将不会被调用。清除prototype作用域的对象并释放任何prototype bean所持有的昂贵资源,都是

    客户端代码的职责。(让Spring容器释放被prototype作用域bean占用资源的一种可行方式是,通过使用bean的后置

    处理器,该处理器持有要被清除的bean的引用。)  

猜你喜欢

转载自anfield-yang.iteye.com/blog/1113899