• Spring的Bean的基本概念


      Spring其实就是一个大型的工厂,而Spring容器中的Bean就是该工厂的产品。Spring容器能够生产哪些产品,取决于配置文件的配置。

      对于我们而言,使用Spring框架做两件事:开发Bean、配置Bean。对于Spring框架而言,它要做的是根据配置文件来创建Bean实例,并调用Bean实例的方法完成"依赖注入"。

      一、Bean的定义

      <beans.../>元素是Spring配置文件的根元素,<bean.../>元素是<beans.../>元素的子元素。<beans.../>元素可以包含多个<bean.../>子元素,每个<bean.../>元素定义一个Bean实例,每一个Bean对应Spring容器里的一个Java实例。

      定义Bean时通常需要指定两个属性。

      id:确定该Bean的唯一标识符。容器对Bean管理、访问、以及该Bean的依赖关系,都是通过该属性完成。Bean的id属性在Spring容器中是唯一的。

      class:指定该Bean的具体实现类。注意这里不能使接口。通常情况下,Spring会直接使用new关键字创建该Bean的实例,因此,这里必须提供Bean实现类的类名。

      除此之外,还可以为<bean.../>元素指定name、alias属性。

      name:指定一个Bean实例的标识名,表示将为该Bean指定别名。如果需要为Bean实例指定多个别名,可以在name属性中使用逗号、冒号或者空格来分隔多个别名,后面通过任一别名即可访问该Bean实例。

      alias:指定一个别名。在一些特殊的情况下,程序无法在定义Bean时就指定所有的别名,而是在其他地方为一个已经存在的Bean实例指定别名,则可以使用<alias…/>元素来完成。

      二、容器中Bean的作用域

      当通过Spring容器创建一个Bean实例时,不仅可以完成Bean实例的实例化,还可以为Bean指定特定的作用域。

      Spring支持5种作用域。

      singleton:单例模式。在整个Spring IoC容器中,使用singleton定义的Bean将只用一个实例。

      prototype:原型模式。每次通过容器的getBean方法获取prototype定义的Bean时,都将产生一个新的Bean实例。

      request:对应每次HTTP请求,使用request定义的Bean都将产生一个新的实例,即每次HTTP请求都会产生不同的Bean实例。当然只有在Web应用中使用Spring时,该作用域才真正有效。

      session:对应每次HTTP Session请求,使用session定义的Bean都将产生一个新的实例,即每次HTTP Session都将产生不同的Bean实例。同request一样,只有在Web应用中才会有效。

      global session:每个全局的HTTP Session对应一个Bean实例。仅在protlet Context的时候才有效。

      如果我们不指定Bean的作用域,则Spring会默认使用singleton作用域。比较常用的singleton和prototype。设置Bean的作用域是通过scope属性来指定。可以接受singleton、prototype、request、session、global session 5个值。

      如果一个Bean实例被设置为singleton,那么每次请求该Bean时都会获得相同的实例。容器负责跟踪Bean实例的状态,负责维护Bean实例的生命周期行为。如果一个Bean实例被设置为prototype,那么每次请求该Bean,Spring都会创建一个新的Bean实例返回给程序,在这种情况下,Spring容器仅仅使用new关键字创建Bean实例,一旦创建成功,容器将不会再跟踪实例,也不会维护Bean实例的状态。

      Java在创建Java实例时,需要进行内存申请。销毁实例时,需要完成垃圾回收。这些工作都会导致系统开销的增加。因此,prototype作用域Bean的创建、销毁代价会比较大。而singleton作用域的Bean实例一旦创建成功,可以重复使用。因此,除非必要,否则尽量避免将Bean的作用域设置为prototype。

      request和session作用域只在web应用中才会有效,并且必须在Web应用中增加额外配置才会生效。为了能够让request和session两个作用域生效,必须将HTTP请求对象绑定到该请求提供的服务线程上,这使得具有request和session作用的Bean实例能够在后面的调用链中被访问到。

      因此我们可以采用两种配置方式:采用Listener配置或者采用Filter配置,在web.xml中。

      Listener配置:

    1 <listener>  
    2     <listener-class>  
    3         org.springframework.web.context.request.RequestContextListener  
    4     </listener-class>  
    5 </listener>      

      Filter配置:

    1 <filter>  
    2     <filter-name>requestContextFilter</filter-name>  
    3     <filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>  
    4 </filter>  
    5 <filter-mapping>  
    6     <filter-name>requestContextFilter</filter-name>  
    7     <url-pattern>/*</url-pattern>  
    8 </filter-mapping> 

      一旦在web.xml中增加上面两种配置中的一种,程序就可以在Spring配置文件中使用request或者session作用域了。

      文章摘自http://blog.csdn.net/chenssy/article/details/8222744

      感谢博主的总结与分享!

  • 相关阅读:
    Sony Z1 USB 调试
    消除“Unfortunately, System UI has stopped”的方法
    变动数据模拟cons
    string to integer
    single number
    罗马数字转为阿拉伯数字
    整数逆序
    回文数字
    回文字符串
    count and say
  • 原文地址:https://www.cnblogs.com/lynujyq/p/5540580.html
Copyright © 2020-2023  润新知