Spring IoC之bean生命周期及相關介面使用
本文主要講Spring IoC容器初始化bean的完整過程。
1.bean生命周期
下圖為IoC容器中bean的生命周期圖:
2.相關介面使用
2.1相關介面概覽
bean生命周期圖中相關方法根據作用域可分三類:
容器級:
BeanFactoryPostProcessor、BeanPostProcessor和InstantiationAwareBeanPostProcessor都是容器初始化bean時提供的可擴展介面,也叫後置處理器。
Bean級:
1)實現介面BeanNameAware、BeanFactoryAware、InitializingBean和DiposableBean;
2)指定自身方法:init-method, destroy-method
註:
實現BeanNameAware可獲取容器中該bean的beanName
實現BeanFactoryAware可獲取該bean所在的容器(進而可根據beanName獲取該容器中其他的bean及beanDefinition)
初始化bean時特殊處理:
1)使用java提供的@PostConstruct註解標記指定方法
2)實現spring提供的InitializingBean介面的afterPropertiesSet方法
3)在applicationContext.xml中bean節點的屬性init-method中指定方法
(執行順序為:構造方法 -> @PostConstruct -> afterPropertiesSet -> init-method)
銷毀bean時特殊處理:
1)使用java提供的@PreDestroy註解標記指定方法
2)實現spring提供的DisposableBean介面的destroy方法
3)在applicationContext.xml中bean節點的屬性destroy-method中指定方法
(執行順序為:@PreDestroy -> destroy -> destroy-method)
2.2.BeanFactoryPostProcessor
BeanFactoryPostProcessor只有一個方法postProcessBeanFactory。是在spring載入完BeanDefinition之後最先執行的,也是bean生命周期中最早執行的,通過實現它可以在初期修改BeanDefinition。
實現之後在spring配置文件中註冊一下就可以生效了。
spring自帶的實現類有PropertyPlaceholderConfigurer等。
2.3.BeanPostProcessor
BeanPostProcessor有兩個方法:postProcessBeforeInitialization和
postProcessAfterInitialization,分別是在bean初始化之前和之後執行的。
2.4.InstantiationAwareBeanPostProcessor
InstantiationAwareBeanPostProcessor是BeanPostProcessor的子介面,調用時機為:
1)實例化Bean之前調用postProcessBeforeInstantiation
2)bean注入屬性後調用postProcessPropertyValues
3)實例化Bean之後調用postProcessAfterInstantiation方法
2.5.FactoryBean VS BeanFactory
BeanFactory,以Factory結尾,是一個工廠類(介面)。BeanFactory是spring的核心容器,它的職責包括:實例化、初始化bean,管理bean之間的依賴關係等。
FactoryBean是一種特殊的bean,通常用來創建複雜的bean。返回的實例是getObject方法返回的實例。如
mybatis的SqlSessionFactoryBean和spring-aop中的ProxyFactoryBean就是FactoryBean的實現。
TAG:明哥JAVA指南 |