singleton作用域
singleton是Spring容器默认的作用域,当Bean的作用域为singleton时,Spring容器就只会存在一个共享的Bean实例,并且所有对Bean的请求,只要id与该Bean的id属性相匹配,就会返回同一个Bean实例。singleton作用域对于无会话状态的Bean(如Dao 组件、Service组件)来说,是最理想的选择。
在Spring配置文件中,Bean的作用域是通过<bean>元素的scope属性来指定的,该属性值可以设置为singleton、prototype、request、session、globalSession、application和websocket七个值,分别表示表2-2中的7个作用域。要将作用域定义成singleton,只需将scope的属性值设置为singleton即可。其示例代码如下:
<bean id="scope" class="com.itheima.scope.Scope" scope="singleton"/>
在项目chapter02中,创建一个com.itheima.scope包,在包中创建Scope类,该类不需要写任何方法。然后在该包中创建一个配置文件beans4.xml,将上述示例代码写入配置文件中。最后在包中创建测试类ScopeTest,来测试singleton作用域,编辑后如文件1所示。
文件1 ScopeTest.java
1 package com.itheima.scope;
2 import org.springframework.context.ApplicationContext;
3 import
4 org.springframework.context.support.ClassPathXmlApplicationContext;
5 public class ScopeTest {
6 public static void main(String[] args) {
7 // 定义配置文件路径
8 String xmlPath = "com/itheima/scope/beans4.xml";
9 // 加载配置文件
10 ApplicationContext applicationContext =
11 new ClassPathXmlApplicationContext(xmlPath);
12 // 输出获得实例
13 System.out.println(applicationContext.getBean("scope"));
14 System.out.println(applicationContext.getBean("scope"));
15 }
16 }
执行程序后,控制台的输出结果如图1所示。
图1 运行结果
从图1可以看出,两次输出的结果相同,这说明Spring容器只创建了一个Scope类的实例。
需要注意的是,如果不设置scope="singleton",其输出结果也是一个实例,因为Spring容器默认的作用域就是singleton。