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下)。
^_^还有什么好方法或者疑问和意见欢迎大家提出来一起讨论!