2.3 bean的作用域
作用域限定了Spring Bean的作用范围,在Spring配置文件定义Bean时,通过声明scope配置项,可以灵活定义Bean的作用范围。例如,当你希望每次IOC容器返回的Bean是同一个实例时,可以设置scope为singleton;当你希望每次IOC容器返回的Bean实例是一个新的实例时,可以设置scope为prototype。
scope配置项有5个属性,用于描述不同的作用域。
l singleto,使用该属性定义Bean时,IOC容器仅创建一个Bean实例,IOC容器每次返回的是同一个Bean实例。
l prototyp,使用该属性定义Bean时,IOC容器可以创建多个Bean实例,每次返回的都是一个新的实例。
l reques,该属性仅对HTTP请求产生作用,使用该属性定义Bean时,每次HTTP请求都会创建一个新的Bean,适用于WebApplicationContext环境。
l session,该属性仅用于HTTP Session,同一个Session共享一个Bean实例。不同Session使用不同的实例。
l global-sessio,该属性仅用于HTTP Session,同session作用域不同的是,所有的Session共享一个Bean实例。
下面重点讨论singleton、prototyp作用域,request、session和global-session类作用域放到Spring MVC章节讨论,这里不再做详细讲述。
1、singleton作用域
singleton是默认的作用域,当定义Bean时,如果没有指定scope配置项,Bean的作用域被默认为singleton。singleton属于单例模式,在整个系统上下文环境中,仅有一个Bean实例。也就是说,在整个系统上下文环境中,你通过Spring IOC获取的都是同一个实例。
2、prototype作用域
prototype是默认的作用域,prototype属于多例模式,在整个系统上下文环境中,不只有一个Bean实例。也就是说,在整个系统上下文环境中,你通过Spring IOC获取的都是不同实例。
Bean为scope作用域的配置代码如下。
<bean id="student" class="entity.Student" scope="prototype"/> |
我们编写测试代码如下:
String xmlPath = "student.xml"; ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath); Student stu1= (Student) applicationContext.getBean("student"); Student stu2= (Student) applicationContext.getBean("student"); System.out.println(stu1); System.out.println(stu2); |
程序运行结果如下:
entity.Student@1081592 entity.Student@19a81e8 |
注意这里的Student类并没有设计toStrong()方法去重写Object的toStrong()方法,而是直接使用Object的toStrong()方法打印对象的ID,我们在这里可以看到两个对象的ID不同,这说明生成的两个对象是不同的对象。反之,我们如果对bean的scope作用域做如下配置,
<bean id="student" class="entity.Student"/> |
则程序运行结果如下
entity.Student@1081592 entity.Student@1081592 |
我们在这里可以看到两个对象的ID相同,这说明生成的两个对象是相同的对象,而bean的scope作用域默认值为singleton。

