现在的位置: 首页 > 综合 > 正文

Spring bean中的高级属性和生命周期

2013年03月06日 ⁄ 综合 ⁄ 共 2687字 ⁄ 字号 评论关闭

一.bean的高级属性     

1.bean的高级属性

      bean的依赖通常表现为以下两种形式:

        属性:通过property属性指定;

        构造器参数:通过constructor-arg属性指定。

      这些依赖都接受Spring容器管理,依赖关系的值或者是一个确定的值,或者是Spring容器中其他bean的引用(注意,将内置类型和用户自定义类型都视为数据类型)

     2.Spring实例化BeanFactory时,会校验BeanFactory中每一个Bean实例的配置,包括合作者的bean是否合法,对于singleton行为,并被设置为pre-instantiated的bean,Spring会在创建BeanFactory时,同时实例化bean,实例化bean时,也会将它依赖的bean一起实例化;

     3.BeanFactory与ApplicationContext实例化容器中的bean的时机不同,前者当程序需要bean实例时才创建bean的实例,后者在加载ApplicationContext实例时,会自动实例化容器中的全部的bean;

        也就是说,ApplicationContext默认预实例化Singleton行为的bean,在ApplicationContext创建的时候找到配置错误,而对于BeanFactory,可能BeanFactory被正确地加载,但是在实例化bean的时候,发现bean或者bean的合作者出现错误,这时beanFactory会抛出异常。

    4.bean的配置属性

       (1)value元素:确定字符串参数,可以通过propertyEditor完成从String到其他类型的转换

       (2)ref元素:指定属性值为Spring容器中的其他bean(注意自定义类类型和普通内置类型一样处理),使用ref标记,在Spring部署时即可判断依赖的bean是否存在,而使用value,仅在创建bean的实例时会确定依赖的bean是否存在

    5.depends-on属性

        Spring容器返回bean实例的过程:

        初始化主调bean->初始化依赖bean->将依赖bean注入到主调bean中->返回完整的主调bean实例

        极端情况下,主调类中的初始化模块中使用其他bean,Spring总是先初始化主调bean,执行初始化模块时还没有实例化主调bean,被依赖的bean还没有实例化,使用depends-on属性,可以在初始化主调bean之前,强制一个或多个bean初始化。

    6.自动装配

       无需显式使用ref指定依赖bean,由BeanFactory检查XML配置文件的内容,为主调函数注入依赖关系;

       自动装配可以具体指定到每个bean,可让某些bean实现自动装配,某些不用。

        byName:set+Bean名

        byType:set+Bean的实现类型,如果两个类实现同一个接口,主调bean中使用set+接口类型,则Spring容器无法确定应该注入哪个bean。

        当一个bean既使用自动装配依赖,又使用ref显式指定依赖,则显式指定的依赖覆盖自动装配。

 

  二. bean的生命周期

        1.singleton和non-singleton bean的生命周期管理

       Spring容器不仅能够创建bean实例,还能够管理bean的生命周期,管理bean创建之后,销毁之前的行为。

       并非Sping容器中的所有bean都有生命周期行为,只有接受容器管理生命周期的ean具有生命周期行为,singleton行为的bean接收容器管理生命周期;

       non-singleton行为的bean实例化后,完全交给客户端代码管理,容器不会再跟踪其生命周期,每次客户请求,容器会创建一个新的实例,Spring容器不知道non-singleton bean什么时候销毁。

       singleton行为的bean,每次客户端请求都会返回一个共享实例,客户端程序不能控制bean的销毁,由容器控制bean的产生,销毁,容器在创建bean之后,进行通用资源申请,在销毁bean之前,回收某些资源;

 

        2.协调不同步的bean

          如果singleton bean依赖于non-singleton bean,singleton bean只有一次初始化机会,依赖关系也在初始化时进行,而其依赖的non-singleton bean每次都有新的实例,导致singleton bean的依赖不能得到及时的更新,singleton bean依赖的一直是最原始的bean,及时non-singleton bean后来有了新的实例。

         采用方法注入解决该问题,通常采用lookup方法注入,lookup方法指容器能够重写bean中的抽象或者具体的方法,结果是返回查找容器中其他bean的结果,被查找的bean通常是一个non-singleton行为的bean。

         Spring容器通过使用CGLIB库修改客户端的二进制代码,从而实现主调bean的依赖bean是最新的non-singleton对象

         注意:lookup-method属性指定的方法返回查找容器中其他bean的结果,即返回结果是最新创建的non-singleton bean对象

  

         3.定制bean的生命周期行为

            对于singleton bean,Spring容器知道bean何时实例化结束,何时销毁,Spring容器可以管理实例化结束之后和销毁之前的行为,管理bean生命周期的两个时机为

            bean全部依赖注入之后

            bean即将销毁之前

          (1)依赖关系注入之后的行为

            a. 使用init-method

             在配置文件中通过init-method确定依赖关系注入之后要调用的方法,在bean的实现类中实现该方法;

            b.实现initializingBean接口

           (2)bean销毁之前的行为

            a.使用destroy-method

            b.实现DisposableBean接口

 

抱歉!评论已关闭.