spring-容器工厂实例化流程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring-容器工厂实例化流程相关的知识,希望对你有一定的参考价值。

1.Source

spring 初始化最先获得熟悉资源如url,url,file,

2.beanDefinition

通过解析source文件获得BeanDefinition,其中根节点的对象是RootBeanDefinition。

3.AbstractBeanFactory

1.获得RootBeanDefinition后通过AbstractBeanFactory实例化文件
2.解析RootBeanDefinition的属性时,需要使用到PropertyEditor属性编辑器。
3.getBean方法
4.先通过name获得BeanName
5.然后检查singleton是否有bean实例已经生成
  ● DefaultSingletonBeanRegistry 实例化singletonbean的工厂
  ● 先从singletonObjects中查找是否有已经实例化的bean有则返回
  ● 没有在加载则查看是否正在加载中。
  ● 如果是正在加载中,则看是否已经提前曝光
  ● 如果没有提前曝光,则判定是否可以提前曝光
  ● 如果可以提前曝光则去获取当前beanName的factory。
  ● 如果factory存在则提前曝光当前bean,然后移除这个工厂。
6.如果检查有实例返回
  ● 则检查是不是factoryBean
  ● 如果是普通bean实例则直接返回对象
  ● 如果是factoryBean, 则去查找当前eanName的RootBeanDefinition,获取synthetic属性后去创建实例
  ● 如果创建的是单列
  ● 先从缓存获取当前实例。
      ○ 如果没有缓存则直接获取factoryBean.getObject()
      ○ 返回实例    
7.如果没有实例返回
  ● 如果是在一个循环引用中又引用到了自己,则抛出异常
  ● 检查是否有parentBeanFactory,如果有而且也包含beanName的BeanDefinition 则在parentBeanFactory中获得实例
  ● 如果没有parentBeanFactory,则依次判定是否是singleton,prototype,scope;
  ● 根据类型创建完实例以后,再检查创建的实例是否和要创建的类有区别。
  ● 最后返回bean实例。

以上是关于spring-容器工厂实例化流程的主要内容,如果未能解决你的问题,请参考以下文章

Spring启动流程

spring bean 容器的生命周期是什么样的?

Spring- Bean的实例化

Spring基础:Bean的实例化

Spring《二》bean的实例化与生命周期

看完这篇自己都可以写Spring IOC 容器 Bean 对象实例化--乐字节java