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