zoukankan      html  css  js  c++  java
  • 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

      感谢博主的总结与分享!

  • 相关阅读:
    Java 蓝桥杯 算法训练 貌似化学
    Java 蓝桥杯 算法训练 貌似化学
    Java 蓝桥杯 算法训练 字符串的展开 (JAVA语言实现)
    Java 蓝桥杯 算法训练 字符串的展开 (JAVA语言实现)
    Java 蓝桥杯 算法训练 字符串的展开 (JAVA语言实现)
    Java 蓝桥杯 算法训练 字符串的展开 (JAVA语言实现)
    Java 蓝桥杯 算法训练 字符串的展开 (JAVA语言实现)
    JAVA-蓝桥杯-算法训练-字符串变换
    Ceph:一个开源的 Linux PB 级分布式文件系统
    shell 脚本监控程序是否正在执行, 如果没有执行, 则自动启动该进程
  • 原文地址:https://www.cnblogs.com/lynujyq/p/5540580.html
Copyright © 2011-2022 走看看