Spring 的 Bean

1、Bean的标识(Id、name、class)

元素时Spring配置文件的根元素,元素时元素的子元素,元素可以包含多个元素,子元素用于定义一个bean,每个bean是接受Spring容qi里的java实例

在定义bean时,通常必须指定的一下属性:

a、id:id属性是que定该bean的唯一标识符,容qi对bean管理、访问及该bean依赖关系,都通过该属性完成。bean的id属性在Spring容qi中是唯一的。
b、name: name属性可以指定一个或者多个名称,各个名称之间用逗号或者分号分开,第一个默认为标识名称,后面多个自动生成bean的别名。
c、class: class属性是指定该bean的具体实现类,这里不能是接口。通常qing况下,Spring会直接使用new关键字创建该bean的实例,因此,这里必须提供bean实现类的类名。

So…来个简单的配置文件案例看一哈

<!--配置文件的根元素 :beans -->
<beans>
	<!-- 第一个bean实例 -->
	<bean id="call"	class="com.ym.dao.DCallType" />
	<!-- 第二个bean实例-->
	<bean name="beanAnimal,type,1" class="com.ym.entity.Animal">	
	
</beans>

然后再说一哈:

在Spring容qi集中管理bean的实例化时,bean实例可以通过BeanFactory的getBean(String beanid)方法得到。此时,BeanFactory将变成简单工厂模式里的工厂,程序只需要获quBeanFactory引用,即可获得Spring容qi管理quan部实例的引用,从而使程序不要具体实例的实现过程耦合。在不部分J2EE应用中,当应用qi动时,会自动创建Spring容qi实例,组件之间直接依赖注入的方式耦合,甚至无需访问Spring容qi。


2、Bean的作用域

作用域

描述

singleton

在每个Spring Ioc 容器中一个bean 定义对应的一个对象实例

prototype

一个bean定义对应多个对象实例

request

在一次HTTP 请求中,一个bean定义对应一个实例;即每次 HTTP 请求将会有各自的bean实例,它们依据某个bean 定义创建而成。该作用域仅在基于web的Spring ApplicationContext 情形下有效

session

在一个 HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于Web的 Spring ApplicationContext 情形下有效

global session

在一个全局的 HTTP Session中,一个bean定义对应一个实例。典型情况下,仅在使用 protlet context 的时候有效。 该作用域仅在基于Web的 Spring ApplicationContext 情形下有效

1、 singleton 作用域
当一个 bean 的作用域为 singleton ,那么 Spring Ioc 容器中只会存在一个共享的bean,并且所有对bean的请求,只要id与该bean定义想匹配,则只会返回bean的同一实例。
通俗的就是说,当吧一个bean 定义设置为 singleton 作用域时, Spring Ioc 容器只会创建该bean定义的唯一实例。这个单一实例会被存储到单例缓存(singleton cache)中,并且所有针对该bean的后续请求和应用都将返回被缓存的对象实例。
如果不指定bean的作用域,Spring 默认使用singleton 作用域。
如果你要在XML中将bean定义成 singleton,那么你在XML中这样写;

<!-- 采用默认作用域 singleton  -->
	<bean id="call"	class="com.ym.dao.DCallType"/>

<!-- 采用singleton  作用域 -->
	<bean id="call"	class="com.ym.dao.DCallType" scope="singleton"/>

2、 prototype作用域
prototype作用域的bean会导致在每次对该bean请求(将其注入到另一个bean中,或者以程序的方式调用该容器的getBean()方法)时都会创建一个新的bean实例。
如果你要在XML中将bean定义成 prototype,那么你在XML中这样写;

<bean id="call"	class="com.ym.dao.DCallType"  scope="prototype"/>

建议一点:对所有“有状态的bean”建议使用 prototype作用域 而对于“无状态的bean”建议使用 singleton 作用域

对于prototype作用域的Bean,Spring不能对一个prototype bean 的整个生命周期负责:容器在初始化、配置、装配或者是装配完prototype 实例后,将它交给客户端,随后就对该prototype实例不闻不问了。
不管何种作用域,容器都会调用所有对象的初始化生命周期回调方法,但是了,**“prototype”**作用域是个意外,任何配置好容器的生命周期回调方法都将不会被调用。

3、 request 作用域的Bean只对于Web应用才真正有效

request 作用域的bean通常作为Web应用的控制器bean