bean加载过程

发布时间 2023-03-29 15:05:33作者: zhengbiyu

加载过程

  1. load BeanDefinition
  2. merge BeanDefinition(GenericBeanDefinition -》RootBeanDefinition)
    1. 不存在parent,直接创建RootBeanDefinition
    2. 存在parent,复制新的RootBeanDefinition,并且覆盖parent相关配置
  3. postProcessBeanFactory(覆盖org.springframework.context.support.AbstractApplicationContext#postProcessBeanFactory)
  • 调用上下文本身的beanFactory后置处理方法
  1. invokeBeanFactoryPostProcessors(实现BeanFactoryPostProcessor扩展)
  • 调用beanFactoryPostProcessors。
    • 例如:在配置文件中使用占位符的方式来配置bean属性,解析由PropertyPlaceholderConfigurer实现。
  • BeanDefinitionRegistryPostProcessor接口继承自BeanFactoryPostProcessor接口。
    • 例如:mybatis的mapper接口无需写实现类,就是由MapperScannerConfigurer实现BeanDefinitionRegistryPostProcessor,扫描@Mapper注解修饰的接口,注册factoryBean为MapperFactoryBean的AnnotatedBeanDefinition,最终会创建MapperProxy对象。
  1. registerBeanPostProcessors(实现BeanPostProcessor扩展)
  • 注册bean的后置处理器
  1. 国际化
  2. 初始化事件多播器
  3. 注册监听器
  4. 创建bean
    1. 执行InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation
    2. 实例化bean
    3. 将匿名BeanFactory添加至三级缓存
    4. 属性填充
      1. 循环依赖时,执行依赖对象在三级缓存中的BeanFactory,得到代理对象,但是被代理对象还未完成属性填充和初始化,将代理对象放入二级缓存
    5. 执行org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation
    6. 初始化bean
    7. 执行beanPostProcessor的beforeInitialization
      1. InitDestroyAnnotationBeanPostProcessor处理@PostConstruct
    8. 执行initializingBean#afterPropertiesSet()
      1. 例如:AOP事务管理用到的类,TransactionProxyFactoryBean 就是利用afterPropertiesSet方法事先把事务管理器 TransactionManager的代理类对象给生成好了,后面调用FactoryBean对象的getObject方法的时候,就直接把这个代理对象返回出去了。
    9. 执行init-method
    10. 执行beanPostProcessor的afterInitialization
      1. AnnotationAwareAspectJAutoProxyCreator继承AbstractAutoProxyCreator,处理Aspect注解,生成代理对象
    11. 此时被代理对象完成了初始化,是个完整对象,于是将代理对象放入一级缓存。

循环依赖