zoukankan      html  css  js  c++  java
  • Spring-Scope

    Scope的概念

    声明容器中的对象的生命周期。当对象在Spring容器中组装生成之后,由scope负责该对象在容器中的读取和销毁操作。

    Scope的5种类型

    Spring Framework支持五种作用域。 最初提供了两种类型: singletonprototype。在2.0后引入了三种只能在web应用的ApplicationContext中使用的类型: request, session, global session。理论上,Spring 2.0支持无数多种类型bean,用户可根据自己的需要,增加新的bean类型。

    默认是singleton。

    Singleton

    在Spring IOC容器中,只存在一个共享的bean实例。这个单一实例被存储在单例缓存(Singleton Cache)中,对于所有针对该bean的后续请求和引用,只要ID和定义相匹配,就返回同一实例。

    image

    区分:

    单例设计模式表示一个ClassLoader中只有一个class存在,而这里的singleton作用域表示一个容器中只存在一个bean。

    Prototype

    对该类对象的每一个请求,都会产生一个新的BEAN实例,相当于一个new操作

    特殊的一点是, Spring容器无法对prototype bean的整个生命周期负责,容器在初始化、配置、装配完一个prototype实例后,将它交给调用者,就不再管它了,任何配置好的析构生命周期回调方法都不会被调用。清除prototype对象并释放持有的资源,都由调用者负责。

    对于其他作用域,容器会调用所有对象的初始化生命周期回调方法。

    image

    Request

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

    image

    注意!!request、session、global session使用的时候首先要在初始化web的web.xml中做如下配置:

    如果你使用的是Servlet 2.4及以上的web容器,那么你仅需要在web应用的XML声明文件web.xml中增加下述ContextListener即可。如果是Servlet2.4以前的web容器,那么你要使用一个javax.servlet.Filter的实现,这里略。

     image

    Session

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

    Global session

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

    image

    使用Tips

    默认情况下,从bean工厂所取得的实例为Singleton。单态模式的bean由IOC容器管理,非线程安全

    有状态的bean都使用Prototype作用域,而对无状态的bean则应该使用singleton作用域。

    如果你希望容器里的某个bean拥有其中某种新的web作用域,除了在bean级上配置相应的scope属性,还必须在容器级做一个额外的初始化配置。即在web应用的web.xml中增加一个ContextListener。

    在ssh2 项目中 , struts2的action交由spring管理的时候 ,spring默认是singleton的 ,而struts2的action显然是有状态的 ,所以必须显示设置为 scope=“prototype”。prototype为原型模式 , 每次action请求过来都会创建一个action。

    对那些Dao的实现类推荐scope=“singleton” ,因为这些类没有状态,用singleton只需维护一个实例,显然性能高一些。

    参考文献

    <Spring 解密>

    http://www.cnblogs.com/qq78292959/p/3716827.html

  • 相关阅读:
    Electron+Vue开发跨平台桌面应用
    html2canvas生成图片
    将某个DIV内容保存成图片,使用HTML2CANVAS截图方法(高清图并解决图片跨域问题)
    css3实现动画效果完整代码demo
    Vue + element从零打造一个H5页面可视化编辑器——pl-drag-template
    Vue.Draggable学习总结
    3d学习网
    vue router 报错: Uncaught (in promise) NavigationDuplicated {_name:""NavigationDuplicated"... 的解决方法
    网页适配 iPhoneX,就是这么简单
    关于for循环
  • 原文地址:https://www.cnblogs.com/lddbupt/p/5553313.html
Copyright © 2011-2022 走看看