您的位置:首页 > 编程语言 > Java开发

Spring系列之对Bean的认识

2016-07-25 17:15 369 查看
    【回顾】
    在上篇博客中,我们认识了Spring的核心容器:BeanFactory和ApplicationContext。正是因为它们,才能帮助我们主动创建对象。在Spring容器中,还有另外一个必定出现的词——Bean。
    对于我们而言,我们使用Spring框架所做的就是两件事:开发Bean、配置Bean。对于Spring框架来说,它要做的就是根据配置文件来创建Bean实例,并调用Bean实例的方法完成“依赖注入”。
    对于Spring中Bean的认识,你了解多少?下面就从基础开始,一点点积累,一步步加深对Bean的认识。
    【基础知识】
    下面是一个较完整的Bean的配置文档:

<!-- Bean的配置文档 -->
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"> <!-- 1. 定义一个Bean,id是这个Bean的唯一标识,class指出这个Bean的来源,singleton指定这个Bean是否是单例模式,depends-on指定这个Bean初始化前,强制初始化date -->
<bean id="HelloWorld" class="com.bjpowernode.spring.manager.HelloWorld" singleton="true" depends-on="date">
<!-- 2. 配置Bean的属性 -->
<property name="msg">
<value>Hello World</value>
</property>
<!-- 3. 指定Bean的一个依赖 -->
<property name="date">
<ref bean="date"/>
</property>
<!-- 4. 定义上面Bean的结束 -->
</bean>
<bean id="date" class="java.util.Date"/>
</beans>

从内容和注释我们可以总结出以下几点:
    1. Bean的标识(id和name) 
        在Spring中可以用id或name属性来指定Bean的id,并且至少指定一个id。id和name的区别:id属性是Bean的唯一标识,不可重复标记,并且它在XML DTD中作为一个XML元素的ID属性被标记。如果开发中需要给Bean增加别名,可以通过name属性指定一个或多个id,多个id用(,)或(;)分隔。
    2. Bean的类(class)
    	在Spring的配置文档中,class属性指明了Bean的来源,即Bean的实际路径。
    3. Singleton的使用
    	在Spring中,Bean可以定义为两种部署模式:singleton或non-singleton(prototype)。Spring默认为singleton模式。
    	如果一个Bean被定义为singleton模式:只有一个共享的实例存在,所有对这个Bean的请求都会返回这个唯一的实例。
    	如果一个Bean被定义为non-singleton(prototype)模式,那么对这个Bean的每次请求都会创建一个新的bean实例。
    4. 使用依赖depends-on
    	Bean的depends-on属性可以用来在初始化使用这个Bean之前,强制执行一个或多个Bean的初始化。详见上面代码中的第1点。
    【生命周期】
    	一个Bean从定义到销毁都有一个生命周期。在Spring中,Bean的生命周期包括Bean的定义、初始化、使用和销毁4个阶段。下面分别进行介绍:
    1. Bean的定义
    	在Spring中,通常是通过配置文档的方式定义Bean。如上面的代码所示。
    	在一个大的应用中,会有很多的Bean需要定义,这样配置文档就会很大,而不好维护。所以,我们可以把相关的Bean放在一个配置文档中,出现多个配置文档。
    2. Bean的初始化
    	第一种方式,通过在配置文档中指定init-method属性完成。    
实现思路:在类中增加一个初始化方法init(),用来完成初始化工作,并去掉构造函数。修改配置文档,指定Bean的初始化方法为init(),即init-method="init",并去掉通过setter注入方法。
    	第二种方式,实现org.springframework.beans.factory.InitializingBean接口。
实现思路:让类实现InitializingBean接口,增加afterPropertiesSet()完成初始化工作,然后修改配置文档。
    	以上两种方式都是Bean的初始化方式,但第一种方式没有把代码耦合于Spring。
    3. Bean的使用
    	在Spring中,Bean的使用有3种方式:BeanWrapper、BeanFactory和ApplicationContext。
    	通过前面的学习,我们对后面两种都很熟悉了。在此也不具体讲解了。
    4. Bean的销毁
    	在Spring中,Bean的销毁有以下两种方式:
    	第一种,在配置文档中通过制定destroy-method属性完成。
    	第二种,实现org.springframework.beans.factory.DisposableBean接口。
    	和初始化方式相同,不再写出具体的实现思路。
    【指定依赖】
    	在Spring中,ref属性是用来指定依赖的。包括三种模式:local、Bean和parent。
    local模式:
    	如果一个Bean与被参考引用的Bean在同一个XML文件中,而且被参考引用的Bean是用id来命名的,那么就可以使用ref的local属性。
    Bean模式:
    	用ref元素的Bean属性指定被参考引用的Bean是Spring中最常见的形式,它允许指向的Bean可以在同一个XML中,也可以不在同一个XML中。Bean属性的值可以与被参考引用的Bean的id属性相同,也可以与被参考引用的Bean的name属性相同。
    parent模式:
    	用parent属性指定被参考引用的Bean时,允许引用当前BeanFactory或ApplicationContext的父BeanFactory或ApplicationContext中的Bean。parent属性的值可以与被参考引用的Bean的id属性相同,也可以和name属性相同。
在这3中模式中,用local属性和Bean属性指定依赖最为常用。两者的比较:
    相同:两种模式都可以用Bean的id来进行参考引用,都可以对同一XML中的Bean进行参考引用。
    不同:用Bean属性指定依赖可以使用name进行参考引用,还可以对不同XML中的Bean进行参考引用。
    【自动装配】
    	在Spring中,自动装配可以指定给单独的Bean。通过自动装配,可以使得开发人员减少属性的设定工作。Bean自动装配包括5种模式,即:byName,byType,constructor,autodetect和no。
    byName模式:
    	通过Bean的属性名字进行自动装配,在Spring配置文档中,查找一个与将要装配的属性同样名字的Bean。
    byType模式:
    	如果XML中正好有一个与属性类型一样的Bean,则自动装配。如果多余一个这样的Bean,则抛出异常,指出可能不能对那个Bean使用byType自动装配。
    constructor模式:
    	根据构造函数的参数进行自动装配。Spring会根据构造参数的类型去查找合适类型的Bean,然后用它去设置构造函数的参数值。
    autodetect模式:
    	通过对Bean检查类的内部选择constructor或byTpye,如果找到了constructor,就用constructor;没有,而找到byType,就用byType。
    no模式:
    	不定义自动装配模式。
    【总结】
    	本篇博客从一个较为完整的XML文档出发,从具体代码中理解了配置bean的基本含义。其次,了解了Bean的生命周期、指定依赖和自动装配相关知识。
Bean作为一个纯粹的Java对象,其实并没有之前理解得那么抽象,很多东西看过了就收获了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: