Spring的Bean的基本概念

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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,那么每次请求该di的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

  感谢博主的总结与分享!

以上是关于Spring的Bean的基本概念的主要内容,如果未能解决你的问题,请参考以下文章

spring练习,在Eclipse搭建的Spring开发环境中,使用set注入方式,实现对象的依赖关系,通过ClassPathXmlApplicationContext实体类获取Bean对象(代码片段

浅谈Spring中Bean的生命周期

Spring启动过程源码分析基本概念

Spring启动过程源码分析基本概念

Spring启动过程源码分析基本概念

Spring 源码阅读-BeanDefinition 基本概念