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-容器工厂实例化流程的主要内容,如果未能解决你的问题,请参考以下文章