Bean生命周期
IOC
整個(gè)都包含Bean生命周期內(nèi):
-> new AnnotationConfigApplicationContext(XXX); 掃描注解,beanDefinition
-> applicationContext.getBean() 創(chuàng)建Bean實(shí)例
生命周期大致順序
-> 生成BeanDefinition
-> 調(diào)用 BeanFactoryPostProcessor.postProcessBeanFactory
-> bean實(shí)例化
-> 調(diào)用 AbstractAutowireCapableBeanFactory.doCreateBean
-> createBeanInstance
-> 調(diào)用構(gòu)造方法
-> populateBean屬性注入
-> 調(diào)用set方法注入屬性
-> BeanPostProcessor.postProcessBeforeInitialization
-> bean初始化initializeBean
-> afterPropertiesSet
-> init-method
-> BeanPostProcessor.postProcessAfterInitialization
1.Bean實(shí)例化
在實(shí)例化之前會(huì)調(diào)用BeanFactoryPostProcessor的方法修改BeanDefinition
調(diào)用AbstractAutowireCapableBeanFactory.doCreateBean蟹瘾,createBeanInstance 實(shí)例化Bean
2.屬性注入
populateBean
3.Bean初始化
在調(diào)用Bean初始化之前會(huì)調(diào)用BeanPostProcessor postProcessBeforeInitialization
- 1.實(shí)現(xiàn)InitializingBean
- 2.實(shí)現(xiàn)afterPropertiesSet
- 3.配置init-method
在調(diào)用Bean初始化之后會(huì)調(diào)用BeanPostProcessor postProcessAfterInitialization
Q&A
1.BeanFactoryPostProcessor和BeanPostProcessor區(qū)別
這兩個(gè)接口實(shí)在是很像坡疼,但是作用以及場(chǎng)景不同
1.1.BeanFactoryPostProcessor
該接口中有一個(gè)方法:
void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
實(shí)現(xiàn)BeanFactoryPostProcessor 接口 通過覆蓋postProcessBeanFactory方法,可以在bean實(shí)例化之前修改BeanDefinition
在Spring的bean創(chuàng)建之前,修改bean的定義屬性种冬。
Spring允許BeanFactoryPostProcessor在容器實(shí)例化任何其他Bean之前讀取配置元數(shù)據(jù)付燥,并可以根據(jù)需要進(jìn)行修改。
BeanFactoryPostProcessor是在spring容器加載了bean的beanDefinition之后枝哄,在bean實(shí)例化之前執(zhí)行的肄梨。可以同時(shí)配置多個(gè)BeanFactoryPostProcessor,并通過order來控制執(zhí)行順序
(eg:可以吧bean的scope從singleton改為prototype)
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory arg0)
throws BeansException {
System.out
.println("BeanFactoryPostProcessor調(diào)用postProcessBeanFactory方法");
BeanDefinition bd = arg0.getBeanDefinition("person");
bd.getPropertyValues().addPropertyValue("phone", "110");
}
1.1.1.常見的BeanFactoryPostProcessor實(shí)現(xiàn)類
- org.springframework.beans.factory.config.PropertyPlaceholderConfigurer
- org.springframework.beans.factory.config.PropertyOverrideConfigurer
- org.springframework.beans.factory.config.CustomEditorConfigurer
1.2.BeanPostProcessor
該接口有兩個(gè)方法:
Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
這兩個(gè)方法挠锥,可以在spring容器實(shí)例化bean之后众羡,在執(zhí)行bean的初始化方法前后,添加一些自己的處理邏輯蓖租。
BeanPostProcessor是在spring容器加載了beanDefinition并且實(shí)例化bean之后執(zhí)行的粱侣。BeanPostProcessor的執(zhí)行順序是在BeanFactoryPostProcessor之后。
1.2.1.常見的BeanPostProcessor實(shí)現(xiàn)類
- org.springframework.context.annotation.CommonAnnotationBeanPostProcessor:支持@Resource注解的注入
- org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor:支持@Required注解的注入
- org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor:支持@Autowired注解的注入
- org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor:支持@PersistenceUnit和@PersistenceContext注解的注入
- org.springframework.context.support.ApplicationContextAwareProcessor:用來為bean注入ApplicationContext等容器對(duì)象