Bean生命周期
IOC
整个都包含Bean生命周期内:
-> new AnnotationConfigApplicationContext(XXX); 扫描注解,beanDefinition
-> applicationContext.getBean() 创建Bean实例
生命周期大致顺序
-> 生成BeanDefinition
-> 调用 BeanFactoryPostProcessor.postProcessBeanFactory
-> bean实例化
-> 调用 AbstractAutowireCapableBeanFactory.doCreateBean
-> createBeanInstance
-> 调用构造方法
-> populateBean属性注入
-> 调用set方法注入属性
-> BeanPostProcessor.postProcessBeforeInitialization
-> bean初始化initializeBean
-> afterPropertiesSet
-> init-method
-> BeanPostProcessor.postProcessAfterInitialization
1.Bean实例化
在实例化之前会调用BeanFactoryPostProcessor的方法修改BeanDefinition
调用AbstractAutowireCapableBeanFactory.doCreateBean,createBeanInstance 实例化Bean
2.属性注入
populateBean
3.Bean初始化
在调用Bean初始化之前会调用BeanPostProcessor postProcessBeforeInitialization
- 1.实现InitializingBean
- 2.实现afterPropertiesSet
- 3.配置init-method
在调用Bean初始化之后会调用BeanPostProcessor postProcessAfterInitialization
Q&A
1.BeanFactoryPostProcessor和BeanPostProcessor区别
这两个接口实在是很像,但是作用以及场景不同
1.1.BeanFactoryPostProcessor
该接口中有一个方法:
void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
实现BeanFactoryPostProcessor 接口 通过覆盖postProcessBeanFactory方法,可以在bean实例化之前修改BeanDefinition
在Spring的bean创建之前,修改bean的定义属性。
Spring允许BeanFactoryPostProcessor在容器实例化任何其他Bean之前读取配置元数据,并可以根据需要进行修改。
BeanFactoryPostProcessor是在spring容器加载了bean的beanDefinition之后,在bean实例化之前执行的。可以同时配置多个BeanFactoryPostProcessor,并通过order来控制执行顺序
(eg:可以吧bean的scope从singleton改为prototype)
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory arg0)
throws BeansException {
System.out
.println("BeanFactoryPostProcessor调用postProcessBeanFactory方法");
BeanDefinition bd = arg0.getBeanDefinition("person");
bd.getPropertyValues().addPropertyValue("phone", "110");
}
1.1.1.常见的BeanFactoryPostProcessor实现类
- org.springframework.beans.factory.config.PropertyPlaceholderConfigurer
- org.springframework.beans.factory.config.PropertyOverrideConfigurer
- org.springframework.beans.factory.config.CustomEditorConfigurer
1.2.BeanPostProcessor
该接口有两个方法:
Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
这两个方法,可以在spring容器实例化bean之后,在执行bean的初始化方法前后,添加一些自己的处理逻辑。
BeanPostProcessor是在spring容器加载了beanDefinition并且实例化bean之后执行的。BeanPostProcessor的执行顺序是在BeanFactoryPostProcessor之后。
1.2.1.常见的BeanPostProcessor实现类
- 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等容器对象