Bean生命周期

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等容器对象

你可能感兴趣的:(Bean生命周期)