[译]8-spring bean的作用域

在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会为每个请求重新创建实例.

时间: 2024-11-13 09:25:30

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

Spring Bean的作用域(转)

Spring Bean的作用域 .singleton  [单例] eg:<bean id="personService" class="com.yinger.service.impl.PersonServiceBean" scope="singleton"></bean> 在每个Spring IoC容器中一个bean定义只有一个对象实例. 请注意Spring的singleton bean概念与“四人帮”(GoF)模式一书中

Spring Bean的作用域 实例

Spring 默认创建的对象是单例模式的对象 设置Bean的作用域,通过Bean元的Scope属性 Scope取值范围: Singleton:单例 proptotype:非单例 Request:创建该Bean,并调用request.setAttribute("beanId",beanObj); Session:创建该Bean,并调用request.getSession().setAttribute("beanId",beanObj); globalSession:全

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

一.request与session的区别 request简介 request范围较小一些,只是一个请求. request对象的生命周期是针对一个客户端(说确切点就是一个浏览器应用程序)的一次请求,当请求完毕之后,request里边的内容也将被释放点 . 简单说就是你在页面上的一个操作,request.getParameter()就是从上一个页面中的url.form中获取参数. 但如果一个request涉及多个类,后面还要取参数,可以用request.setAttribute()和request.

Spring bean的作用域和生命周期

bean的作用域 1.singleton,prototype, web环境下:request,session,gloab session 2.通过scope="" 来进行配置 3.对于singleton  spring容器只会创建一个共享实例,prototype则会创建不同的实例 bean的生命周期(bean自身的方法,bean级生命周期接口方法,容器级生命周期接口方法) 分为BeanFactory的生命周期和ApplicationContext的生命周期 1.对于BeanFactor

spring bean的作用域和自动装配

1 Bean的作用域 l  singleton单列:整个容器中只有一个对象实例,每次去访问都是访问同一个对象  默认是单列 l  prototype原型: 每次获取bean都产生一个新的对象,比如Action l  request:每次请求时创建一个新的对象 l  session:在会话的范围内是一个对象,http那个session l  global session:只在portlet下有用,表示application l  application:在应用范围内有效 注意:配置action的时

Spring bean的作用域

1.介绍 Spring bean定义时,实际上是创建类实例的配方,这意味着,通过这个配方,即可创建该类的很多对象.Spring框架支持的5种作用域: 2.单例作用域介绍 单例作用域为默认的作用域,单例bean只会产生一个该bean对应的类型的实例对象,对于所有的请求,Spring容器都只会返回一个实例.这个实例被存储在Spring容器的单例池缓存中,之后所有对该bean对象的请求和引用,都将从该单例缓存池中取,而不是再生成新的对象. 但是,需要注意的点是该单例缓存并不是我们之前在设计模式中所了解

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

Spring Framework支持五种作用域,如下图所示: singleton:表示一个容器中只会存在一个bean实例,无论在多少个其他bean里面依赖singleton bean,整个容器都只会存在一个实例.相当于是容器的全局变量. prototype:一个容器中可能会存在多个bean实例,prototype bean的实例产生有两种情况,一种是其他bean请求依赖prototype 容器会为其他bean分别创建一个实例.另外一种就是通过ApplicationContextAware 接口的

Spring——Bean的作用域

Spring中Bean的作用域有五种,分别是singleton.prototype.request.session.globalSession.其中request.session.globalSession这三个作用域只有在web开发中才会使用到. 当在 Spring 中定义一个bean时,你必须声明该 bean 的作用域的选项,若没有声明则默认作用域是singleton. 1 singleton 该作用域将 bean 的定义的限制在每一个 Spring IoC 容器中的一个单一实例. *使用:

spring Bean的作用域、生命周期和后处理器

1. Bean的几种作用域 singleton 单例, 在整个spring IoC 容器只存在唯一对象 prototype 多例, 每次进行getBean 创建新的对象 request ,创建Bean, 放入request范围 request.setAttribute session ,创建Bean ,放入session范围 session.setAttribute globalSession 全局会话, 分布式多个系统, 共享同一个会话 单例Bean,在ApplicationContext对象

Spring ----Bean 的作用域

Scope 作用域:<bean id="hello"  class="com.xx.Hello" scope=" singleton"> </bean> 1.单例(默认)singleton   创建后 只存在一个类实例 2.原型  prototype  创建后 存在多个类实例 3.请求  request 4.会话 session 5.应用程序 application 6.套接字websocket 原文地址:https://