在spring中使用<bean/>标签定义bean的时候,可以使用scope属性来定义bean的作用域.如果想要每次

从spring容器得到一个新创建的bean实例,可以指定scope="prototype";如果想要每次从spring容器得

到同一个bean实例,可以指定scope="singleton"

spring中bean的作用域有如下5种类,其中有3中适用于web应用程序.5中作用域的介绍如下:

作用域 说明
singleton 单例bean.整个IOC容器中只有该bean的一个实例
prototype 原型.每次从spring IOC容器中得到的都是新创建的bean
request 每次http请求都会创建一个bean.只适用于web应用
session 每个session共用一个bean.只适用于web应用
global-session 整个web应用中只会实例化一次该bean

本文我们只介绍singleton和prototype作用域.

singleton作用域

在spring IOC容器中的bean如果scope指定为singleton,那么该bean在此IOC容器中只会存在一个实例.

首次从spring IOC容器中获得该bean的时候,spring IOC容器会实例化并装配该bean,随后把该bean

缓存起来,以后在从spring IOC容器取得该bean的时候,IOC容器会把缓存的bean实例返回.

下面看一个singleton作用域的例子程序.

1.创建com.tutorialspoint.scope.singleton包,并在包中创建HelloWorld.java类,内容如下:

package com.tutorialspoint.scope.singleton;

public class HelloWorld {

    private String message;

    public void setMessage(String message) {
this.message = message;
} public void getMessage() {
System.out.println("Your Message : " + message);
}
}

2.在src目录下,创建scope_singleton.xml配置文件,内容如下:

在配置文件中,指定bean的作用域为singleton.

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id="helloWorld" class="com.tutorialspoint.scope.singleton.HelloWorld" scope="singleton"/> </beans>

3.在包com.tutorialspoint.scope.singleton中创建MainApp.java,内容如下:

package com.tutorialspoint.scope.singleton;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class MainApp { public static void main(String[] args) { //实例化spring IOC容器
ApplicationContext context = new ClassPathXmlApplicationContext("scope_singleton.xml");
//从容器中得到作用域为singleton的helloWorld bean.并强制转换为HelloWorld
HelloWorld objA = (HelloWorld)context.getBean("helloWorld");
//调用objA的setMessage方法,给成员变量message赋值
objA.setMessage("I am object A");
//打印objA的成员变量message
objA.getMessage();
//再次从spring IOC容器中得到作用域为single的的helloWorld bean
HelloWorld objB = (HelloWorld)context.getBean("helloWorld");
//直接得到objB的成员变量message,可以发现objB的message也被赋值了,说明从IOC容器中得到的是同一个bean实例
objB.getMessage();
//再次确认,看看objA和objB所引用的对象是否是同一个对象,从打印信息中可以验证objA和objB确实是同一个对象
System.out.println(objA==objB);
}
}

4.运行程序验证结果,如下:

最后我们修改scope_singleton.xml配置文件,把scope="singleton"去掉,再次运行程序.发现两次运行

结果完全一致.这就证明了:spring IOC容器所管理的bean的作用域默认情况下是singleton

prototype作用域

spring IOC容器所管理的scope为prototype的bean,在每次用户请求从IOC容器中得到该bean的时候,都

会新创建该bean的一个实例,并返回给用户.一般情况有状态的bean的scope会被设置为prototype;无状态

bean的scope设置为singleton.(可以简单的认为有成员变量,并且会对该变量进行修改的类都是有状态的).

下面做实验,实验代码跟singleton例子中的代码完全一致,只是配置元数据不同.还是在敲一遍吧

1.新建包com.tutorialspoint.scope.prototype,并在包中新建HelloWorld.java,内容如下:

package com.tutorialspoint.scope.prototype;

public class HelloWorld {

    private String message;

    public void setMessage(String message) {
this.message = message;
} public void getMessage() {
System.out.println("Your Message : " + message);
}
}

2.在src目录下新建scope_prototype.xml文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <!-- 指定helloWorld bean的scope作用域为prototype -->
<bean id="helloWorld" class="com.tutorialspoint.scope.prototype.HelloWorld" scope="prototype"/> </beans>

3.在包com.tutorialspoint.scope.prototype中新建类MainApp.java,内容如下:

package com.tutorialspoint.scope.prototype;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class MainApp {
public static void main(String[] args) {
//实例化spring IOC容器
ApplicationContext context = new ClassPathXmlApplicationContext("scope_prototype.xml");
//从容器中得到作用域为prototype的helloWorld bean.并强制转换为HelloWorld
HelloWorld objA = (HelloWorld) context.getBean("helloWorld");
//设置objA的message成员变量
objA.setMessage("I'm object A");
//得到objA的message成员变量
objA.getMessage();
//再次从spring IOC容器中得到作用域为prototype的helloWorld bean
HelloWorld objB = (HelloWorld) context.getBean("helloWorld");
//获取objB的message的成员变量.发现message为null,证明objA和objB不是同一个实例
objB.getMessage();
//进一步验证objA和objB所引用的对象是否是同一个
System.out.println(objA==objB);
}
}

4.运行程序,验证结果,发现IOC容器中scope为prototype的bean会为每个请求重新创建实例.

[译]8-spring bean的作用域的更多相关文章

  1. Spring Bean的作用域(转)

    Spring Bean的作用域 .singleton  [单例] eg:<bean id="personService" class="com.yinger.ser ...

  2. Spring bean的作用域以及生命周期

    一.request与session的区别 request简介 request范围较小一些,只是一个请求. request对象的生命周期是针对一个客户端(说确切点就是一个浏览器应用程序)的一次请求,当请 ...

  3. spring bean 的作用域之间有什么区别

    spring bean 的作用域之间有什么区别? spring容器中的bean可以分为五个范围.所有范围的名称都是说明的, 1.singleton:这种bean范围是默认的,这种范围确保不管接受到多个 ...

  4. spring bean 的作用域

    spring bean 的作用域: 1.单例(singleton):默认是单例模式,也就是说不管给定的bean被注入到其他bean多少次,注入的都是同一个实例. 2.原型(prototype):每次注 ...

  5. Spring bean的作用域和生命周期

    bean的作用域 1.singleton,prototype, web环境下:request,session,gloab session 2.通过scope="" 来进行配置 3. ...

  6. [跟我学spring][Bean的作用域]

    Bean的作用域 什么是作用域呢?即“scope”,在面向对象程序设计中一般指对象或变量之间的可见范围.而在Spring容器中是指其创建的Bean对象相对于其他Bean对象的请求可见范围. Sprin ...

  7. Spring Bean的作用域类型

    Bean的作用域类型 singleton :在Spring IOC容器中仅存在一个Bean实例,Bean以单实例的方式存在; prototype :每次从容器中调用Bean时,都返回一个新的实例,即每 ...

  8. spring bean的作用域和自动装配

    1 Bean的作用域 l  singleton单列:整个容器中只有一个对象实例,每次去访问都是访问同一个对象  默认是单列 l  prototype原型: 每次获取bean都产生一个新的对象,比如Ac ...

  9. Spring Bean Scope (作用域)

    singleton: 单例模式,针对每个spring容器,只有一个该类的实例被管理,每次调用此实例都是同一个对象被返回,所以适用于无状态bean.默认情况下,singleton作为spring容器中b ...

  10. Spring Bean的作用域以及lookup-method标签的使用

    Spring Framework支持五种作用域,如下图所示: singleton:表示一个容器中只会存在一个bean实例,无论在多少个其他bean里面依赖singleton bean,整个容器都只会存 ...

随机推荐

  1. Nginx+Tomcat+memcached高可用会话保持

    Nginx+Tomcat+memcached高可用会话保持 文章来源dyc2005   一.概述 之前文章已经描述了企业高可用负载相关的架构及实现,其中常用的nginx或haproxy,LVS结合ke ...

  2. Android Support v4,v7,v13的区别和应用场景

    android-support-v4 是谷歌推出的兼容包,最低兼容Android1.6的系统,里面有类似ViewPager等控件.ViewPager在Android 1.6以下的版本是不自带的,所以要 ...

  3. 初始化mysql数据库时提示字符编码错误的解决办法

    有时候在安装完数据库并初始化的时候会出现如下错误: root@localhost mysql-5.5.19]# bash scripts/mysql_install_db --user=mysql - ...

  4. 1018: Give me the answer

    1018: Give me the answer 时间限制: 1 Sec  内存限制: 32 MB提交: 55  解决: 15[提交][状态][讨论版][命题人:外部导入] 题目描述 Farmer J ...

  5. 2018.8.26 Spring自学如门

    什么是Spring? Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE De ...

  6. 2017.9.25 JSP内置对象的概述

    1.JSP的定义: 在JSP中是为了便于数据信息的存储.传递.获取,专门设置了九个内置对象, jsp内置对象是指他们是预先设定的,不需创建,每个对象都有自己的属性和方法. 2.JSP内置对象 对象名称 ...

  7. CentOS上安装mongodb

    安装mongodb pymongo修改yum源vi /etc/yum.repos.d/10gen.repo[10gen]name=10gen Repositorybaseurl=http://down ...

  8. C语言中volatile关键字的作用[转]

    一.前言 1.编译器优化介绍: 由于内存访问速度远不及CPU处理速度,为提高机器整体性能,在硬件上引入硬件高速缓存Cache,加速对内存的访问.另外在现代CPU中指令的执行并不一定严格按照顺序执行,没 ...

  9. Linux添加swap分区

    swap分区的作用为当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用,那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到S ...

  10. git 常用命令及仓库创建

    一.常用命令 1.添加到本地仓库缓存 git add . 2.查看本地仓库状态 git status 3.提交到本地仓库 git commit -am 'project init' 4.连接线上分支 ...