• (五)SpringIoc之Bean的作用域


    此文转自

    https://blog.csdn.net/icarus_wang/article/details/51586776#

    有状态bean和无状态bean请看 https://blog.csdn.net/bingjing12345/article/details/9794945


    Spring Bean 中所说的作用域,在配置文件中即是“scope”

    在面向对象程序设计中作用域一般指对象或变量之间的可见范围。

    而在Spring容器中是指其创建的Bean对象相对于其他Bean对象的请求可见范围。


    • 在Spring 容器当中,一共提供了5种作用域类型
      • singleton(Springmvc默认是singleton单例模式)
      • prototype
      • request
      • session
      • global session

    使用方法如下:

    <bean id="userInfo" class="cn.lovepi.UserInfo" scope=" prototype "></bean>
    

    singleton作用:当Bean的作用域为singleton的时候,Spring容器中只会存在一个共享的Bean实例,所有对Bean的请求只要id与bean的定义相匹配,则只会返回bean的同一实例。单一实例会被存储在单例缓存中,为Spring的缺省作用域。Bean以单实例的方式存在,单实例模式是重要的设计模式之一,在Spring中对此实现了超越,可以对那些非线程安全的对象采用单实例模式。

    singleton解析

    在1中car这个Bean生命周期声明为了singleton模式,其他的bean如2,3,4引用了这个Bean。在容器中boss1、boss2、boss3的属性都指向同一个bean car。

    1. <bean id="car" class="cn.lovepi.Car" scope="singleton"></bean>
    2. <bean id="boss1" class="cn.lovepi .Boss” p:car-ref=“car"></bean>
    3. <bean id="boss2" class="cn.lovepi .Boss” p:car-ref=“car"></bean>
    4. <bean id="boss3" class="cn.lovepi .Boss” p:car-ref=“car"></bean>
    

    不仅在容器中通过对象引入配置注入引用相同的car bean,通过容器的getBean()方法返回的实例也指向同一个bean。
    在默认的情况下Spring的ApplicationContext容器在启动的时候,自动实例化所有的singleton的bean并缓存于容器当中。

    • 优点
      • 对bean提前的实例化操作,会及早发现一些潜在的配置的问题。
      • Bean以缓存的方式运行,当运行到需要使用该bean的时候,就不需要再去实例化了。加快了运行效率。
    • 缺点
      • 容器启动就实例,花费时间更多

    prototype解析

    prototype作用:是指每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时,相当于执行new Bean()的操作。
    对于有状态的Bean应该使用prototype,对于无状态的Bean则使用singleton。在默认情况下,Spring容器在启动时不实例化prototype的Bean。此外,Spring容器将prototype的实例交给调用者之后便不在管理他的生命周期了。

    Boss1、boss2、boss3所引用的都是一个新的car的实例,每次通过容器getBean()方法返回的也是一个新的car实例。

    1. <bean id=“car" class="cn.lovepi.Car" scope=“prototype"></bean>
    2. <bean id=“boss1" class="cn.lovepi.Boss” p:car-ref=“car"></bean>
    3. <bean id=“boss2" class="cn.lovepi.Boss” p:car-ref=“car"></bean>
    4. <bean id=“boss3" class="cn.lovepi.Boss” p:car-ref=“car"></bean>
    

    当用户使用Spring的WebApplicationContext时,还可以使用另外3种Bean的作用域,即request,session和globalSession。

    在使用Web应用环境相关的Bean作用域时,必须在Web容器中进行一些额外的配置:使用http请求监听器来进行配置。

    <listener> <listener-class>
        org.springframework.web.context.request.RequestContextListener
    </listener-class></listener>
    

    RequestContextListener实现了ServletRequestListener监听器接口,该监听器监听http请求事件。Web服务器接收到的每一次请求都会通知该监听器。

    Spring容器的启动和关闭事件由web容器的启动和关闭事件来触发。如果Spring容器中的bean需要request、session和globalSession作用域的支持,Spring容器本身就必须获得web容器的http请求事件。以http请求事件来驱动bean的作用域的控制逻辑,也就是说通过配置RequestContextListener接口,Spring和web容器的结合就更紧密了。


    request解析

    request作用:Request作用域针对的是每次的Http请求,Spring容器会根据相关的Bean的
    定义来创建一个全新的Bean实例。在请求处理完成之后便及时销毁这个bean。


    session解析

    session作用:针对http session起作用,Spring容器会根据该Bean的定义来创建一个全新的Bean的实例。Session结束后就销毁bean。

  • 相关阅读:
    spring mvc处理json
    Unable to read TLD "META-INF/c.tld"错误
    linux设置tomcat开机自动启动
    linux tomcat自启动设置
    向PE文件植入后门代码技术讨论
    对自助提卡系统EDLM的一次代码审计
    XE下显示托盘图标(TrayIcon)
    delphi 查看编译版本
    Context Menus
    API Monitor---------------Using API Monitor to crack copy protected software
  • 原文地址:https://www.cnblogs.com/qiyiguoandqijiguo/p/10886824.html
Copyright © 2020-2023  润新知