天天看点

Spring Bean的生命周期小析(二)

Spring Bean的生命周期小析(二)

下面我们写个程序测试一下:

InstantiationAwareBeanPostProcessor接口是BeanPostProcessor接口的子接口,在Spring1.2中定义的,在Spring2.0中为其提供了一个适配器类org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessorAdapter,一般情况下,我们可以方便的扩展该适配器覆盖感兴趣的方法以定义实现类。所在我们在这里也是继承的InstantiationAwareBeanPostProcessorAdapter。

输出结果为:

Spring Bean的生命周期小析(二)

输出结果和我们上面画的图是一样的。但是这里需要注意的是我们的Bean实现了ApplicationContextAware这个接口。有的人可能是用另外的一个Bean实现了ApplicationContextAware这个接口,然后输出结果可能和我们上面的图是不一样的,为什么会不一样呢?因为实现ApplicationContextAware接口的Bean和我们定义的业务Bean是一样的,即ApplicationContextAware是一个Bean级的生命周期接口,它不是容器级的生命周期接口!!!在这里我们再做个总结,总结一下Bean的生命周期的执行顺序,先执行容器级的生命周期的接口:BeanFactoryPostProcessor的postProcessBeanFactory方法(这个容器只会执行一次),接着实例化BeanPostProcessor的实现类,实例化InstantiationAwareBeanPostProcessorAdapter的实现类;然后一个Bean被创建的顺序是这样的:执行容器级的生命周期接口:InstantiationAwareBeanPostProcessorAdapter的postProcessBeforeInstantiation方法,再执行Bean的实例化,再执行容器级的生命周期接口:InstantiationAwareBeanPostProcessorAdapter的postProcessAfterInstantiation,再执行容器级的生命周期接口:InstantiationAwareBeanPostProcessorAdapter的postProcessPropertyValues,再接着调用bean自身的setter方法进行属性值的设置,再接着调用Bean级的生命周期接口:BeanNameAware的setBeanName方法,再接着调用Bean级的生命周期接口:BeanFactoryAware的setBeanFactory方法,再接着调用Bean级的生命周期接口:ApplicationContextAware的setApplicationContext方法,再接着调用容器级的生命周期接口:BeanPostProcessor中的postProcessBeforeInitialization方法,再接着调用Bean级的生命周期接口:InitializingBean的afterPropertiesSet方法,再接着调用配置文件中的init-method指定的方法,再接着调用容器级的生命周期接口:BeanPostProcessor中的postProcessAfterInitialization方法,再接着调用容器级的生命周期接口:InstantiationAwareBeanPostProcessor的postProcessAfterInitialization方法,接着执行一些的业务操作,当容器关闭时,先调用Bean级的生命周期接口:DiposibleBean的destory方法,最后调用配置文件中destory-method指定的方法。

当然Spring在实例化Bean的时候还有很多Spring自身的处理,这里我们说的只是和Bean的生命周期中有关的一些东西(Spring提供的能让我们控制Bean的内容)。

参考:

Spring 3.x 企业应用开发实战   陈雄华 林开雄著。