作用域的种类
Spring 容器在初始化一个 Bean 的实例时,同时会指定该实例的作用域。Spring3 为 Bean 定义了五种作用域,具体如下。
1)singleton
单例模式,使用 singleton 定义的 Bean 在 Spring 容器中只有一个实例,这也是 Bean 默认的作用域。
2)prototype
原型模式,每次通过 Spring 容器获取 prototype 定义的 Bean 时,容器都将创建一个新的 Bean 实例。
3)request
在一次 HTTP 请求中,容器会返回该 Bean 的同一个实例。而对不同的 HTTP 请求,会返回不同的实例,该作用域仅在当前 HTTP Request 内有效。
4)session
在一次 HTTP Session 中,容器会返回该 Bean 的同一个实例。而对不同的 HTTP 请求,会返回不同的实例,该作用域仅在当前 HTTP Session 内有效。
5)global Session
在一个全局的 HTTP Session 中,容器会返回该 Bean 的同一个实例。该作用域仅在使用 portlet context 时有效。
singleton 作用域
singleton 是 Spring 容器默认的作用域,当一个 Bean 的作用域为 singleton 时,Spring 容器中只会存在一个共享的 Bean 实例,并且所有对 Bean 的请求,只要 id 与该 Bean 定义相匹配,就只会返回 Bean 的同一个实例。
通常情况下,这种单例模式对于无会话状态的 Bean(如 DAO 层、Service 层)来说,是最理想的选择。
在 Spring 配置文件中,可以使用 <bean> 元素的 scope 属性,将 Bean 的作用域定义成 singleton,其配置方式如下所示:
<bean id="person" class="com.mengma.scope.Person" scope="singleton"/>
在项目的 src 目录下创建一个名为 com.mengma.scope 的包,在该包下创建 Person 类,类中不需要添加任何成员,然后创建 Spring 的配置文件 applicationContext.xml,将上述 Bean 的定义方式写入配置文件中,最后创建一个名为 PersonTest 的测试类,编辑后如下所示。
package com.mengma.scope;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class PersonTest {
@Test
public void test() {
// 定义Spring配置文件路径
String xmlPath = "com/mengma/scope/applicationContext.xml";
// 初始化Spring容器,加载配置文件,并对bean进行实例化
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
xmlPath);
// 输出获得实例
System.out.println(applicationContext.getBean("person"));
System.out.println(applicationContext.getBean("person"));
}
}
使用 JUnit 测试运行 test() 方法,运行成功后,控制台的输出结果

prototype 作用域
使用 prototype 作用域的 Bean 会在每次请求该 Bean 时都会创建一个新的 Bean 实例。因此对需要保持会话状态的 Bean(如 Struts2 的 Action 类)应该使用 prototype 作用域。
在 Spring 配置文件中,要将 Bean 定义为 prototype 作用域,只需将 <bean> 元素的 scope 属性值定义成 prototype,其示例代码如下所示:
<bean id="person" class="com.mengma.scope.Person" scope="prototype"/>
可以看到,两次输出的结果并不相同,这说明在 prototype 作用域下,Spring 容器创建了两个不同的 Person 实例。

最新文章

  1. PHP Math 函数
  2. Security7:View Usage
  3. vs2013 括号自动配对样式设置
  4. linq/EF/lambda 比较字符串日期时间大小
  5. 白话学习MVC(七)Action的执行一
  6. IE下a标签跳转失败
  7. Maven学习:Eclipse使用maven构建web项目(转)
  8. Spring 小示例
  9. 如何使用Prism框架的EventAggregator在模块间进行通信
  10. easyui DateTimeBox OK
  11. [转]整理jquery使用好习惯
  12. Zookeeper Api
  13. 【BZOJ 3697】采药人的路径
  14. Mac下搭建solr搜索引擎与PHP扩展开发(下)
  15. EF6 学习笔记(三):排序、过滤查询及分页
  16. 网络基础之socket
  17. (转)Android开发之封装标题栏
  18. Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) A. Checking the Calendar 水题
  19. 关于关闭TAB,IFRAME占用的内存不能释放问题
  20. 可用于nodejs的SuperAgent(ajax API)

热门文章

  1. POJ 3050 Hopscotch 四方向搜索
  2. 15 SQL中的安全问题
  3. 新闻网大数据实时分析可视化系统项目——19、Spark Streaming实时数据分析
  4. vSphere 计算vMotion的迁移原理
  5. HIWORD HIBYTE
  6. 045、Java中使用if语句进行判断
  7. 006-PHP检测是否为整数
  8. Xilinx Vivado器件分配管脚:LVDS差分电平信号如何分配管脚?
  9. ListView的DrawSubItem时间添加边框,字体变粗问题
  10. 转载-- SQL连接查询2 外连接(左右联接查询)