spring的Bean scopes(作用域)

Bean scopes(作用域)

singleton(单例)当一个bean的作用域为singleton,那Spring IoC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。这是默认的作用域。


Prototype(原型)作用域的bean会导致在每次对该bean请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)时都会创建一个新的bean实例。


*。对于prototype作用域的bean,有一点非常重要,那就是Spring不能对一个prototype bean的整个生命周期负责:容器在初始化、配置、装饰或者是装配完一个prototype实例后,将它交给客户端,随后就对该prototype实例不闻不问了。

 

*.根据经验,对有状态的bean应该使用prototype作用域,而对无状态的bean则应该使用singleton作用域。

 

request请求、session会话、global session全局会话

仅在web应用中使用,一般用得很少,可以忽略。或查阅参考文档3.4.4

 

情景:接昨天所学,spring准备将一个参考UserDAOImpl实现的UserDAO实例userDAO注入到UserService的实例userService中去

 

<bean name="u"

class="com.bjsxt.dao.impl.UserDAOImpl">

</bean>

<bean id="userService

class="com.bjsxt.service.UserService"  scope="prototype">

<property name="userDAO" ref="u" />

</bean>

 

【JUNIT测试代码段:】

UserService service1 =

  (UserService)ctx.getBean("userService");

UserService service2 =

  (UserService)ctx.getBean("userService");

System.out.println(service1 == service2);

 

∴控制台输出的结果是false。因为不是同一个对象。

 

如果:

<bean name="u"

class="com.bjsxt.dao.impl.UserDAOImpl">

</bean>

<bean id="userService

class="com.bjsxt.service.UserService scope="singleton">

<property name="userDAO" ref="u" />

</bean>

 

∴控制台输出的结果是true。因为都是同一个对象。

 

 

⊙_⊙最后,按照我的惯例,附上本次的项目源码(来自尚学堂马士兵的源码),类库用到三个(spring.jar  junit.jar(eclipse自带) commons-logging.jar,缺少类库可以到http://moshowgame.iteye.com/admin/blogs/1606825下)。

^_^还有什么好方法或者疑问和意见欢迎大家提出来一起讨论!

猜你喜欢

转载自moshow.iteye.com/blog/1607598