此答案有毒,请谨慎服用。如果需要深入而且准确理解Spring的工作原理以及设计思想,请阅读以下官方文档。本稿仅供学习!
(1)关于IoC以及依赖注入
在Spring框架当中,IoC是十分重要的概念。从前由硬编码植入的对象通过简单的配置,即可达到解耦合的目的,从而使开发变得更加灵活。
在这过程中,Spring提供了一套容器,当然这个容器可以是BeanFactory,也可以是ApplicationContext,ApplicationContext是BeanFactory的升级版,比BeanFactory有了更多的功能。这套容器的主要作用是实例化、管理、装载以及卸载掉对象的。
(2)关于生命周期
那么在Spring容器中,一个对象从生成到销毁就有了它的生命周期,而在这个过程中,为了更加方便开发者在对象生命周期中更加灵活地处理这些Bean,Spring开放了相关的容器扩展点给开发者。
举个简单的例子,比如程序在运行过程中,Bean因为遇到异常而被强制销毁了,这时候你就需要在Bean销毁的过程中输出异常信息。这时候如果将这个Bean继承了BeanPostProcessor,并且重写了里面的distroy()方法,此时你就能自如地做好销毁控制了。
知道了这点,我们则需要更好地理解Spring的生命周期。
一个Bean的生命周期是怎么样的呢?
1)初始化
通过配置文件或者注解Spring会根据相关信息实例化bean后放置在Spring的容器中。
2)初始化回调
当Bean继承了InitializingBean,重写afterProperiesSet()既可以执行初始化回调函数。
3)销毁
Bean进入销毁过程
4)销毁回调
当Bean继承了DisposableBean时,重写destroy方法,可在销毁后执行销毁回调方法。
一个Bean的生命周期也与它所承载的容器生命周期嘻嘻相关。
因此Spring管理对象还可以实现Lifecycle接口。Lifecycle接口提供了start()方法和stop()方法,实现他们即可在容器初始化和销毁时进入开发者自定义的操作中。
那么题主所说的BeanPostProcessor又是什么呢?
Spring为开发者提供了容器的扩展点,用户可以在这些容器的拓展点实现自己的逻辑以及操作。
BeanPostProcessor作用在一个bean的实例上。这意味着BeanPostProcessor是在实例Bean后进入插入的。
如果用户实现了BeanPostProcessor的postProcessBeforeInitialization(),那么在Bean的afterProperiesSet()调用前会优先调用。
如果用户实现了BeanPostProcessor的postProcessAfterInitialization(),那么在Bean的afterProperiesSet()调用后调用。