`
bolinyang
  • 浏览: 74326 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Bean的生命周期

阅读更多
一.概述
首先,关于生命周期其实就是一个事物从出生到死亡这个阶段,回到我们的程序世界中,对象的生命周期就是对象从创建到销毁这个阶段,在目前的web开发中,Spring这个轻量级的框架被广泛采用,bean是Spring中的一个核心思想,其实bean就是一个对象,但是这个对象的每个成员都有自己的get和set方法,方便获取和设置对象成员变量的值。bean是由spring容器负责管理的,在spring中bean分为单例和多例,单例bean只初始化一次,多例bean每次在调用getBean方的时候都会进行一次初始化,不论是单例bean还是多例bean,他们都有自己的生命周期,只不过单例和多例bean的生命周期阶段可能会有所不一样,就是说在bean的生命周期中,可能有几个阶段单例bean会经历,而多例bean不会经历,或者有几个阶段多例bean会经历,而单例的bean不会经历。下面关于bean的生命周期,就把单例和多例bean整合在一起。在Spring容器中默认所有的bean都是单例的。
二.bean的生命周期示意图


   关于这张生命周期的图,我们做如下的概述:

    [1]getBean方法调用就意味着bean的生命周去即将开始了,我们一般用到的bean工厂有BeanFactory和ApplicationContext两种,ApplicationContext是建立在BeanFactory的基础之上的,如下图所示

    关于这二者之间的区别,首先BeanFactory有的ApplicationContext都有,对于bean的生命周期而言,这里需要说明的是在BeanFactory中的bean在容器创建的时候不会自动初始化,需要在BeanFactory之外调用getBean方法来触发bean的实例化,但是对于ApplicationContext就有所不同了,除非我们自己在XML文件中指定bean是lazy-init的,否则所有的bean在容器创建的时候都会被初始化一次,bean的初始化也是调用getBean方法来实现的,不过这个getBean方法是由容器自己去调用的。


    [2]在实例化bean的时候,bean的缺省构造函数会被调用,这里指注入的方式是setter方法时,bean的缺省构造函数会优先被执行。Spring会优先使用反射来调用这个构造函数来构建一个空壳子。方便Spring容器后续在这个空壳子上调用get和set方法。


    [3]在bean的配置文件中我们会指定bean的一些成员变量,关于bean的配置文件,在使用spring的时候一直感觉自己在搞配置,特别是对于刚开始接触的人而言,发现一大堆的配置,其实这里通过XML文件只是其中一种,我们可以使用其他一些文件来代替XML文件,这个XML文件只是信息的描述,最终是要把这些信息解析出来,当然如果我们提供一种自己的语言来配置,并且有相关的解析程序一样可以的。我们可以大胆想像如何减少配置文件的编写而又保持Spring目前的各种特性。


    [4].Aware接口,实现了相关Aware接口的bean就有了感知的能力,关于Aware这个词在这里用的很形象,翻译过来是感知的意思,就是感觉知道,让bean感觉到某些事情,让bean知道某些事情,如果没有实现相关的感知接口,bean就没有感知到相关事情的能力,这样在Spring容器中就会出现一些有感知能力的bean实例,一些没有任何感知能力的bean实例,有感知能力的bean实例他们的感知能力又有强弱之分,实现的感知接口越多,bean的感知能力就越强。这里经常遇见的两个感知接口BeanNameAware和BeanFactoryAware,关于这两个接口,前者使得bean能感知到自己在Spring容器中的名字,每个bean在Spring容器中都有自己的名字,但是bean要是不实现这个接口,它就无法感知到自己在Spring容器中的名字,后者使得bean能感知到到整个bean工厂的存在,实现了这个接口的bean可以拥有整个bean工厂,这时候这个bean就能感知到bean工厂中其他bean的存在,这个感知接口在解决单例依赖多例的问题时很常见。


    [5]BeanPostProcessor也是一个接口,这个接口中的两个方法可以对bean在不同阶段进行自定义,这可以理解为是spring暴露出来的一个扩展点,方便我们去干涉一些bean工厂的行为。


    [6]InitializingBean是一个接口,需要bean自己去实现,这个接口中的方法在bean的属性设置结束后调用.


    [7]init-method,如果我们在XML配置文件中配置了这个属性,那么这时候相关的方法就会被调用。


    [8]Disposable接口也是需要bean去实现的,然后在bean销毁的时候调用。


    [9]我们同样可以在XML配置文件配置一个destroy-method方法,指定bean销毁时要调用的方法。


三.最后总结

    关于bean的构造虽然Spring容器封装了很多地方,但是依然暴露出一些接口方便程序员自己去定制bean,去干涉一下bean的创建,同时也可以获取bean创建过程中的一些信息,这些信息可以用来解决一些特定场景下的问题。如果我们清楚bean的生命周期以及这些可扩展的点,我们就可以定制自己的bean,当然我们也可以定制自己的bean工厂,前面定制自己bean使用的是BeanPostProcessor接口,定制自己的bean工厂使用的就是BeanFactoryPostProcessor,这都是Spring暴露出来的一些扩展点。Spring的扩展机制传达的就是这样一种理念:你如果觉得我定制的东西不是你想要的话,我允许你在我的基础上定制你想要的东西。
  • 大小: 73.4 KB
  • 大小: 25.8 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics