spring中scope(作用越)理解

  今天总结了一下spring中作用域scope的用法。在spring中作用域通过配置文件形式的用法如下。

<bean id="role" class="spring.chapter2.maryGame.Role" scope="singleton"/>

一. 在spring 中常用的作用域有单例模式(singleton),和多例模式(prototype)

1.当一个bean的 作用域设置为singleton, 那么Spring IOC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。换言之,当把 一个bean定义设置为singleton作用域时,Spring IOC容器只会创建该bean定义的唯一实例。这个单一实例会被存储到单例缓存(singleton cache)中,并且所有针对该bean的后续请求和引用都 将返回被缓存的对象实例,这里要注意的是singleton作用域和GOF设计模式中的单例是完全不同的,单例设计模式表示一个ClassLoader中 只有一个class存在,而这里的singleton则表示一个容器对应一个bean,也就是说当一个bean被标识为singleton时 候,spring的IOC容器中只会存在一个该bean。以下是图解。

2. prototype作用域部署的bean,每一次请求(将其注入到另一个bean中,或者以程序的方式调用容器的 getBean()方 法)都会产生一个新的bean实例,相当与一个new的操作,对于prototype作用域的bean,有一点非常重要,那就是Spring不能对一个 prototype bean的整个生命周期负责,容器在初始化、配置、装饰或者是装配完一个prototype实例后,将它交给客户端,随后就对该prototype实例不 闻不问了。不管何种作用域,容器都会调用所有对象的初始化生命周期回调方法,而对prototype而言,任何配置好的析构生命周期回调方法都将不会被调 用。 清除prototype作用域的对象并释放任何prototype bean所持有的昂贵资源,都是客户端代码的职责。(让Spring容器释放被singleton作用域bean占用资源的一种可行方式是,通过使用 bean的后置处理器,该处理器持有要被清除的bean的引用。)如下图解。

3.对于springweb来说还存在两种作用越,request,session,global session。

  request:表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效。

  session:表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP session内有效。

  golabl session:

     global session作用域类似于标准的HTTP Session作用域,不过它仅仅在基于portlet的web应用中才有意义。Portlet规范定义了全局Session的概念,它被所有构成某个 portlet web应用的各种不同的portlet所共享。在global session作用域中定义的bean被限定于全局portlet Session的生命周期范围内。如果你在web中使用global session作用域来标识bean,那么web会自动当成session类型来使用。

  总结:对于spring来说最常用的作用域是prototype,singleton.当在项目中不存在多线程共享对象或是不需要对象在单线程安全不受其他线程影响,我们可以选择singleton,这样可以节约内存,用法可以用在dao层,数据访问层,因为在dao层我们一般将并发下访问交给数据库连接池来管理,这样整个项目就、只需要一个连接池来管理,singleton更合适。而对于一些其它对象需要线程安全,也就是在线程中new对象,用singleton可能导致线程安全。或是生命周期很短的对象,我们可以选择prototype.

时间: 2024-10-20 00:28:25

spring中scope(作用越)理解的相关文章

spring 中单利模式的理解

一.Spring单例模式与线程安全 Spring框架里的bean,或者说组件,获取实例的时候都是默认的单例模式,这是在多线程开发的时候要尤其注意的地方. 单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 当多用户同时请求一个服务时,容器会给每一个请求分配一个线程,这是多个线程会并发执行该请求多对应的业务逻辑(成员方法),此时就要注意了,如果该处理逻辑中有对该单列状态的修改(体现为该单列的成员属性),则必须考虑线程同步问题

spring中InitializingBean接口使用理解

InitializingBean接口为bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的时候会执行该方法. 测试程序如下: import org.springframework.beans.factory.InitializingBean; public class TestInitializingBean implements InitializingBean{ @Override public void afterProp

【转】web.xml中的contextConfigLocation在spring中的作用

一.spring中如何使用多个xml配置文件 1.在web.xml中定义contextConfigLocation参数,Spring会使用这个参数去加载所有逗号分隔的xml文件,如果没有这个参数,spring会默认加载WEB-INF/applicationContext.xml文件(若没有,要新建一个). 例如: <context-param> <param-name>contextConfigLocation</param-name> <param-value&

spring中scope作用域(转)

摘自 http://www.cnblogs.com/qq78292959/p/3716827.html 今天研究了一下scope的作用域.默认是单例模式,即scope="singleton".另外scope还有prototype.request.session.global session作用域.scope="prototype"多例.再配置bean的作用域时,它的头文件形式如下: 如何使用spring的作用域: <bean id="role&quo

spring中@Resource和@Autowired理解

一.@Resource的理解 @Resource在bean注入的时候使用,@Resource所属包其实不是spring,而是javax.annotation.Resource,只不过spring支持该注解@Resource里有name,lookup,type,authenticationType,shareable,mappedName,description这几个属性具体看源码结构截图 0.可以直接在要注入的属性上这样写@Resourceprivate User user;不管配置文件里有没有

spring中@Scope作用域的注解

@Scope简单点说就是用来指定bean的作用域 官方解释是:scope用来声明IOC容器中的对象应该处的限定场景或者说该对象的存活空间,即在IOC容器在对象进入相应的scope之前,生成并装配这些对象,在该对象不再处于这些scope的限定之后,容器通常会销毁这些对象 默认是单例模式,即singleton:Spring IOC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例,一个容器对应一个bean. prototype

spring中ApplicationContextAware接口使用理解

一.这个接口有什么用?当一个类实现了这个接口(ApplicationContextAware)之后,这个类就可以方便获得ApplicationContext中的所有bean.换句话说,就是这个类可以直接获取spring配置文件中,所有有引用到的bean对象.二.怎么使用这个接口?例如我有一个方法类AppUtil,这个方法类中需要使用到的ApplicationContext中的某个bean(companyService).一.因为spring要建立属于自己的容器,就必须要加载自己的配置文件.这个时

web.xml中的contextConfigLocation在spring中的作用

在web.xml中通过contextConfigLocation配置spring, contextConfigLocation参数定义了要装入的 Spring 配置文件. 如果想装入多个配置文件,可以在 <param-value>标记中用逗号作分隔符或通配符. 在web.xml里配置Listener web.xml 代码如下: <listener> <listener-class>org.springframework.web.context.ContextLoader

spring 中 InitializingBean 接口使用理解

前言:这两天在看 spring 与 quart 的集成,所以了解到 spring 是如何初始化 org.springframework.scheduling.quartz.SchedulerFactoryBean 开始执行的,这个正好涉及到 InitializingBean 接口. InitializingBean 接口为 bean 提供了初始化方法的方式,它只包括 afterPropertiesSet 方法,凡是继承该接口的类,在初始化 bean 的时候会执行该方法. Initializing