spring类加载思维导图
2021-08-06 17:20:10 0 举报
AI智能生成
spring类加载思维导图
作者其他创作
大纲/内容
spring简介
出现在2003年左右,是为了解决企业级开发的难度,减轻对项目模块之间的管理
类与类之间的管理,帮助开发人员创建对象,管理对象之间的关系
spring的核心是ioc和aop,能实现模块之间,类之间的解耦合
类与类之间的管理,帮助开发人员创建对象,管理对象之间的关系
spring的核心是ioc和aop,能实现模块之间,类之间的解耦合
官网:spring.io
核心类
1. DefaultListableBeanFactory
AliasRefistry:定义对 alias 的简单增删改等操作
SimpleAliasRefistry:主要使用 map 作为 alias 的缓存,
并对接口 AliasRegistry 进行实现
并对接口 AliasRegistry 进行实现
SingletonBeanRegistry:定义对单例的注册及获取
DefaultSingletonBeanRegistry:对接口 SingletonBeanRegistry 函数的实现
BeanFactory:定义获取 bean 及 bean 的各种属性
HierarchicalBeanFactory:继承 BeanFactory,也就是在 BeanFactory
定义的功能的基础上增加了对 parentFactory 的支持
定义的功能的基础上增加了对 parentFactory 的支持
BeanDefinitionRegistry:定义对 BeanRegistry 的各种增删改操作
FactoryBeanRegistrySupport:在 DefaultSingletonBeanRegistry 的基础上增加了对 FactoryBean 的特殊处理功能
ConfigurableBeanFacotry:提供配置 Factory 的各种方法
ListableBeanFactory:根据各种条件获取 bean 的配置清单
AbstractBeanFactory:综合 FactoryBeanRegistrySupport 和 ConfigurableBeanFactory 的功能
AutowireCapableBeanFactory:提供创建 bean、自动注入、初始化以及应用 bean 的后处理器
AbstractAutowireCapableBeanFactory:综合 AbstractBeanFactory 并对接口 AutowireCapableBeanFactory 进行实现
ConfigurableListableBeanFactory:BeanFactory 配置清单,指定忽略类型及接口等
2. XmlBeanDefinitionReader 对 DefaultListableBeanFactory 类进行了扩展,主要用于从 XML 文档中读取 BeanDefinition
,增加了 XmlBeanDefinitionReader 类型的 reader 属性
方法 this.reader.loadBeanDefinitions(resource),这句代码是整个资源加载的切入点
,增加了 XmlBeanDefinitionReader 类型的 reader 属性
方法 this.reader.loadBeanDefinitions(resource),这句代码是整个资源加载的切入点
注册 BeanDefinitions
解析 XML
由 XmlBeanDefinitionReader 来解析 xml 配置的 bean 相关标签
注册 BeanDefinitions
将 Element 元素信息 封装到 BeanDefinitionHolder
将 BeanDefinition 信息注册到DefaultListableBeanFactory类的beanDefinitionMap变量中
通过 beanName 注册BeanDefinition
通过 别名 注册 BeanDefinition
Bean 加载
1. AbstractBeanFactory.doGetBean()
1.转换对应 beanName
因为传入的name 可能是别名,也可能是 FactoryBean
2.尝试从缓存中加载单例
单例在 Spring 的同一个容器只会创建一次,后续获取bean,直接从缓存中获取。需要比年循环依赖
3.bean 的实例化(从缓存中取实例)
返回对应的实例,有时候存在诸如 BeanFactory 的情况并不是直接返回实例本身而是返回指定方法返回的实例
getObjectForBeanInstance
拿到bean实例,则直接跳转到第9步,没有的话执行下面的操作
4.原型模式的依赖检查
只有在单例情况下才会尝试解决循环依赖
5.检测 parentBeanFactory
如果 beanDefinitionMap 中也是就在所有已经加载的类中不包括 beanName 则尝试从parentBeanFactory 中检测
6.将存储 xml 配置文件的 GernericBeanDefiniton 转换为 RootBeanDefinition
同时会合并父类的相关属性
7.寻找依赖
有某些属性可能是动态配置的,可能依赖其他的bean,若存在依赖则需要递归实例化依赖的bean
8.针对不同的 scope 进行 bean 的创建实例化(实例放入缓存)
Spring中默认的事 singleton,但还存在其他的 prototype、request 之类的
getObjectForBeanInstance
9.检查需要的类型是否符合
检查需要的类型是否符合 bean 的实际类型,例如 bean 其实是个 String,requiredType 确实Integer。
如果不符合 bean 的实际类型,spring提供了各种各样的转换器,用户也可以自己扩展转换器来满足需求
2. AbstractApplicationContext.refresh()
1. 准备刷新的上下文环境
prepareRefresh()
主要是做些准备工作,例如对系统属性及环境变量的初始及验证。基本上是定义了方法,没有具体实现。
2. 初始化 BeanFactory,并进行 XML 文件读取
obtainFreshBeanFactory()
创建 DefaultListableBeanFactory
定制 beanFactory,设置相关属性
加载 BeanDefinition
3. 对 BeanFactory 进行各种功能填充
prepareBeanFactory(beanFactory)
增加 SpEL 语言的支持
增加对属性编辑器的支持
添加 ApplicationContextAwareProcesso 处理器
设置了几个忽略自动装配的接口
注册一些固定依赖的属性
增加 AspectJ 的支持
将相关环境变量及属性注册以羊例模式注册
4. 子类覆盖方法做额外的处理
postProcessBeanFactory(beanFactory)
提供一个空的函数实现 postProcessBeanFactory
5. 激活各种 BeanFactory 处理器
invokeBeanFactoryPostProcessors(beanFactory)
registryPostProcessors:记录通过入参方式注册的 BeanDefinitionRegistryPostProcessor 类型的处理器
regularPostProcessors:记录通过入参方式注册的 BeanFactoryPostProcessor 类型的处理器
postProcessorNames:记录通过配置方式注册的 BeanFactoryPostProcessor 类型处理器
6. 注册拦截 Bean 创建的 Bean处理器,真正调用是在getBean 时候
registerBeanPostProcessors(beanFactory)
注册所有的 BeanPostProcessors
7. 为上下文初始化 Message 源,即不同语言的消息体,国际化处理
initMessageSource()
8. 初始化应用消息广播,并放入 ApplicationEventMulticaster bean中
initApplicationEventMulticaster()
如果用户自定义了时间广播器,那么使用用户自定义的事件广播器
如果用户没有自定义时间广播器,那么使用默认的 SimpleApplicationEventMulticaster
9. 留给子类用来初始化其他的 Bean
onRefresh()
For subclasses: do nothing by default.
10. 在所有注册的 bean 中查找 Listener Bean,注册到消息广播中
registerListeners()
硬编码方式注册的监听器
配置文件注册的监听器
触发监听时间
11. 初始化剩下的单实例(non-lazy-init)
finishBeanFactoryInitialization(beanFactory)
初始化 内容转换器 ConversionService
注册一个默认的 参数占位符 解析器 StringValueResolver
初始化 LoadTimeWeaverAware
冻结配置 冻结所有的 bean 定义,说明注册的 bean 定义将不被修改或进行任何进一步的处理
子主题
12. 完成刷新过程,通知生命周期处理器
finishRefresh()
清理资源缓存
初始化生命周期处理器
调用 Lifecycle.start()
当完成 ApplicationContext 初始化的时候,发布 ContextRefreshedEvent 事件。
注册 applicationContexts
收藏
0 条评论
下一页