Bean生命周期

2019-11-18  本文已影响0人  snakeSkin

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

Q&A

1.BeanFactoryPostProcessor和BeanPostProcessor区别

这两个接口实在是很像,但是作用以及场景不同

1.1.BeanFactoryPostProcessor

该接口中有一个方法:
void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
实现BeanFactoryPostProcessor 接口 通过覆盖postProcessBeanFactory方法,可以在bean实例化之前修改BeanDefinition

@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实现类

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实现类
上一篇 下一篇

猜你喜欢

热点阅读