传统的Java应用,Bean的生命周期很简单。使用Java关键字new 进行Bean的实例化,然后Bean就可以使用了。一旦该Bean不再被使用,则由Java自动进行垃圾回收。
相比之下,Spring容器中的Bean的生命周期就显得细腻的多了,如图所示:
1、Spring对Bean进行实例化。
2、Spring将值和Bean的引用注入进Bean对应的属性中。
3、如果Bean实现了BeanNameAware接口,Spring将Bean的ID传递给setBeanName()接口方法。
4、如果Bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()接口方法,将BeanFactory容器实例传入。
5、如果Bean实现了ApplcationContextAware接口,Spring将调用setApplicationContext()接口方法,将应用上下文的引用传入。
6、如果Bean实现了BeanPostProcessor接口,Spring将调用postProcessBeforeInittializtion()接口方法。
7、如果Bean实现了InitializingBean接口,Spring将调用它们的afterPropertiesSet()接口方法,类似的,如果Bean使用init-method声明了初始化方法, 该方法也会被调用。
8、如果Bean实现了BeanPostProcessor接口,Spring将调用它的postProcessAfterInitialization()方法。
9、此时此刻,Bean已经准备就绪,可以被应用程序使用,它们将一直驻留在应用上下文中,直到应用上下文被销毁。
10、如果Bean实现了DisposableBean接口,Spring将调用它的destory()接口方法。同样,Bean使用destory-method生命了销毁方法,该方法也会被调用。
总结:
Bean的生命周期从Spring容器开始实例化Bean到销毁可以从以下三点来理解:
1、bean自身的方法:包括构造方法、set方法、init-method指定的方法、destroy-method指定的方法
2、Bean级生命周期接口方法:如BeanNameAware、BeanFactoryAware等这些接口方法由bean类实现。
3、容器级生命周期接口方法:BeanPostProcessor等,一般称为后处理器。他们一般不由bean本身实现,独立存在,注册到spring容器中。Spring通过接口反射预先知道,当spring容器创建任何bean时,这些后处理器都会发生作用。所以他们是全局的,用户可以通过编码对只感兴趣的bean进行处理。