一图看懂Spring原理
2023-11-22 17:29:58 0 举报
Spring整体流程逻辑图
作者其他创作
大纲/内容
直接执行BeanDefinitionRegistryPostProcessor接口中的postProcessBeanDefinitionRegistry方法
doGetBean
通过反射创建对象
11、初始化剩下的单实例(非懒加载的)finishBeanFactoryInitialization(beanFactory);
判断是否为空并且在创建中
创建Spring应用程序上下文
开始对象创建
条件判断,非抽象,单例,非懒加载
BeanFactory
为上下文初始化message源,即不同语言的消息体,国际化处理
通过factoryMethod创建对象
定义存放spring内部的BeanPostProcessor List<BeanPostProcessor> internalPostProcessors = new ArrayList<>();
直接跳过
spring.handlers
10、registerListeners();
拼接\"&\" + beanName
可以自由扩展,修改beanFactory中的相关信息,但是使用最多的是对BeanDefinition的修改操作
处理逻辑和上面相同
否
抛出异常
registerBeanPostProcessors
是否立即被加载isEagerInit
上述主要是BDRPP接口方法的执行,下面是BFPP接口方法的执行
有一堆inter的内部对象,大部分跟注解相关1、internalConfigurationAnnotationProcessor-->ConfigurationClassPostProcessor2、AutowiredAnnotationBeanPostProcessor3、CommonAnnotationBeanPostProcessor4、EventListenerMethodProcessor5、AspectJAwareAdvisorAutoProxyCreator
添加BeanPostProcessorChecker(主要用于记录信息)到beanFactory中
ApplicationListenerDetector
从二级缓存里面拿 this.earlySingletonObjects.get(beanName)
遍历每一个元素,判断是否是BeanDefinitionRegistryPostProcessor子类
getBean
2、obtainFreshBeanFactory()前戏,做容器刷新前的准备工作
ApplicationContextAwareProcessor
ConfigurationClassPostProcessor
是
判断是否实现了PriorityOrdered
创建对象的多种方式
5、获取到所有实现了BDRPP
逻辑和BDRPP逻辑相同
2、设置配置文件路径到当前应用程序中
调用构造方法
2、判断当前beanFactory是否是BeanDefinitionRegistry
freezeConfiguration();冻结所有的bean定义
this.singletonFactories.get(beanName);
setConversionService()设置类型转换服务
BeanExpressionResolver设置beanfactory的表达式语言处理器
初始化事件监听多路广播器
resolvableDependencies
是否为null,并且允许早期单例对象引用
定义不同容器存放不同类型BPP
AspectJAwareAdvisorAutoProxyCreator
将所有BeanDefinition的名字创建一个集合List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);
3、prepareBeanFactory(beanFactory);给容器对象完成属性的赋值操作
4、创建存放BDRPP的集合对象,用来存储当前正在执行处理过程中的BDRPPList<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();
9、onRefresh();
从一级缓存里面拿this.singletonObjects.get(beanName)
在prepareBeanFactory中添加BPP
放入二级缓存,清除三级缓存
BeanPostProcessor添加BPP
锁定全局变量并进行处理,三级缓存中获取this.singletonObjects.get(beanName)
找到doXXX1逻辑进去
7、initMessageSource();
添加到registryProcessors,用于后续执行postProcessBeanFactory方法
PropertyEditor属性编辑器
如果存在单例对象工厂,则通过工厂创建一个单例对象singletonObject = singletonFactory.getObject();
合并父类BeanDefinition RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
当bean对象实现FactoryBean接口之后就会变成&beanName,同时如果存在别名,也需要把别名进行转换
getSingleton(beanName)
完成Bean Definition的加载和解析工作
BeanDefinitionMap
6、注册BeanPostProcessorregisterBeanPostProcessor(beanFactory)
3、开始进入容器的创建和刷新环节refresh()
addEmbeddedValueResolver注册默认的嵌入值解析器
1、设置容器的启动时间2、设置活跃状态为true3、设置关闭状态为false4、获取Environment对象,并加载当前系统的属性值到Environment对象中5、准备监听器和事件的集合对象,默认为空的集合
5、invokeBeanFactoryPostProcessor执行BFPP接口中的方法
preInstantiateSingletons();实例化剩下的单例对象
从早期单例对象缓存中获取单例对象(之所称成为早期单例对象,是因为earlySingletonObjects里的对象的都是通过提前曝光的ObjectFactory创建出来的,还未进行属性填充等操作
10、BFPP处理,执行postProcessBeanFactory
beanDefinitionNames存放Bean定义名称集合
doRegisterBeanDefinitions(Element root):执行注册了逻辑
AbstractAutoProxyCreator
二级缓存
将要被执行的BFPP名称添加到processedBeans,避免后续重复执行,processedBeans.add(ppName);
通过supplier创建对象
value:BeanDefinition
是否不为null,并且参数为空
注册ApplicationListenerDetector到beanFactory中 beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
定义存放实现了Ordered接口的BeanPostProcessor的name集合 List<String> orderedPostProcessorNames = new ArrayList<>();
ignoreDependencyInterface
定义存放普通的BeanPostProcessor的name集合 List<String> nonOrderedPostProcessorNames = new ArrayList<>();
是否实现了FactoryBean接口
定义存放实现了PriorityOrdered接口的BeanPostProcessor集合 List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
原型模式下如果存在循环依赖的情况
11、清除元数据缓存(mergeBeanDefinitions、allBeanNamesByType、singletonBeanNameByType) // 因为后置处理器可能已经修改了原始元数据,例如,替换值中的占位符 beanFactory.clearMetadataCache()
创建对象
AutowiredAnnotationBeanPostProcessor
三级缓存
4、执行完毕之后,清空currentRegistryProcessors
抽象出一个接口规范,所有的对象必须要通过getObject方法获取
接口规范实现
4、postProcessBeanFactory默认没有实现,留给子类进行实现操作
8、initApplicationEventMulticaster();
从集合中获取每一个元素,来进行对象的创建
创建两个空的集合对象,用来分类存储BFPP和BDRPPList<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();
ImportAwareBeanPostProcessor
其余三种相同
通过FactoryBean创建对象
createBeanFactory():DefaultListableBeanFactory
setTempClassLoader(null)禁止使用临时类加载器进行类型匹配
开始处理
一级缓存
1、prepareRefresh()前戏,做容器刷新前的准备工作
根据当前标签的命名空间字符串去查找对应的handler处理类
只是普通的BeanFactoryPostProcessor,添加到regularPostProcessors,用于后续执行postProcessBeanFactory方法
根据不同类型筛选到每个容器中,筛选过程中,实现了PriorityOrdered是会优先getBean放入到SpringIOC容器中
返回singletonObject
7、处理没有实现Ordered也没有实现PriorityOrdered
找到所有实现了BeanPostProcessor接口的类名称
3、遍历currentRegistryProcessors,执行postProcessBeanDefinitionRegistry方法
2、添加到registryProcessors中,用于最后执行postProcessBeanFactory方法
经常用到的BeanPostProcessor
parseCustomElement(ele);解析自定义标签
key:beanName
随便定义创建对象的方法,不止局限于getObject
parseBeanDefinitions解析bean定义
loadBeanDefinitions(beanFactory)加载配置文件
在spring中默认没有任何实现,模板方法,但是在springboot中启动了web容器
1、创建一个空的集合,用来存储已经执行过的BFPPSet<String> processedBeans = new HashSet<>()
3、处理用户传入的BFPP
CommonAnnotationBeanPostProcessor
此方法开始进行对象的创建,包含了实例化,初始化,循环依赖,AOP等核心逻辑的处理过程
transformedBeanName(name)
ApplicationContext context = new ClassPathXmlApplicationContext(\"applicationContext.xml\")
双重检查
只是beanDefinition的一个属性值
registerBeanDefinitions()
是否为空
对实现了FactoryBean接口的子类来进行调用和处理工作
6、处理实现Ordered
收藏
收藏
0 条评论
回复 删除
下一页