IOC
解析Config.class得到扫描路径
遍历路径下所有的java类,存在Component注解就存在专用map中(BeanDefinitionMap)
根据相应的规则生成BeanName为key,类作为value
核心类
BeanDefinition
- 类型
- 作用域
- 懒加载
- 初始化方法
- 销毁方法
BeanDefinitionReader
BeanFactory
ApplicationContext
AnnotationConfigApplicationContext
ClassPathXMLApplicationContext
MessageSource 国际化
ApplicationListener 事件发布
BeanPostProcessor Bean后置处理器
FactoryBean bean的创造完全由自己,只会经过初始化后
MetadataReader ClassMetadata AnnotationMetadata 类元数据
Bean的生命周期
Bean的生成
启动applicationContext
创建Beanfactory
初始化Beanfactory
执行Beanfactory后置处理器
扫描
生成BeanDefinition
合并beandefinition
加载类
实例化前
推断构造方法
实例化
beanDefinition后置处理器
实例化后
填充属性
填充属性后
aware回调
初始化前
初始化
初始化后
Bean的销毁过程
发布ContextClosedEvent事件
调用lifecycleProcessor的onClose()方法
销毁单例Bean
- 遍历disposableBeans
- 把每个disposableBean从单例池中移除
- 调用disposableBean的destroy()
- 销毁依赖的这个disposableBean的bean
- 销毁这个disposableBean的inner Bean
- 清空manualSingletonNames,set集合,用户手动注册的单例Bean
- 清空allBeanNamesByType,map集合,key是bean的类型,value是给类型所有的BeanName数组
- 清空singletonBeanNamesByType,类似上一个,只存单例Bean
循环依赖
一级 singletonObjects 完整生命周期Bean对象
二级 eaelySingletonObjects 未经过完整生命周期的对象(aop之后的代理对象)
三级 singletonFactories 。 实例化得到一个原始对象后,基于原始对象暴露一个lambda 表达式。(当出现循环依赖时用到,可能用不到)需要Aop执行得到代理对象,不需要则得到原始对象
启动过程
构造BenaFactory对象
解析配置类,得到BeanDefinition,注册到BeanFactory
初始化MessageSource对象,支持国际化
初始化ApplicationEventMulticaster对象,支持事件机制
添加用户自定义appliecationListener到context中
创建非懒加载单例对象,存在BeanFactory单例池
调用lifecycleBean的start方法
发布contextRefreshedEvent事件
AOP
ProxyFactory 基于cglib和jdk动态代理技术封装的类。
切面 :@Aspectj注解的类,定义PointCut ,advice
连接点: 一个方法的执行
通知: 在连接点上所采取的动作
切点: 匹配一个或者多个连接点
target: 被代理对象
AOP proxy : 代理工厂
织入: 创建代理对象的动作 发生在编译器(Aspectj)和运行时(SpringAop)
事务
@EnableTransactionManagement开启spring事务
事务传播机制:是否存在事务判断Threadlocal是否存在数据库链接对象
SpringMVC请求流程
-
用户请求发送到前端控制器DispatcherServlet:请求拦截分发到各个控制器方法中
-
调用处理器映射器HandlerMapping:根据url找到具体的处理器,生成处理器执行链HandlerExecutionChain(包括处理器对象和处理器拦 截器)一并返回给DispatcherServlet
-
DispatcherServlet根据处理器Handler获取处理器适配器 HandlerAdapter,执行HandlerAdapter处理一系列的操作,如:参数封 装,数据格式转换,数据验证等操作
-
执行处理器Handler(Controller,也叫页面控制器)。
- Handler执行完成返回ModelAndView
- HandlerAdapter将Handler执行结果ModelAndView返回到DispatcherServlet
- DispatcherServlet将ModelAndView传给ViewReslover视图解析
- ViewReslover解析后返回具体View
-
DispatcherServlet对View进行渲染视图(即将模型数据model填充至视图中)
-
DispatcherServlet响应用户
前端控制器 映射器 适配器 处理器 模型视图 视图解析 视图渲染 响应
零配置MVC
注解方式
@WebServlet
@WebFilter
@WebListener
SPI方式
外置tomcat启动通过spi找到容器初始化类,注册上下文加载监听器和前端控制器(创建父子容器)
tomcat启动时执行上下文加载监听器和前端控制器对象的初始化方法,执行容器refresh进行加载
子容器加载时创建SpringMVC所需要的Bean和预准备的数据(通过配置类+@EnableWebMvc可扩展)
子容器注入父容器的Bean,先在子容器找,没找到去父容器
Mybatis结构
接口层
基于statement(crud)和mapper
数据处理层
参数映射(parameterHandler)
sql解析(sqlSource)
sql执行(Executer)
结果映射(ResultSetHandler)
基础支撑层
sql配置方式(xml,注解)
链接管理
事务管理
配置加载
缓存处理
mybatis启动流程
创建sqlSessionFactoryBuilder对象(属性配置,别名配置,拦截器配置,数据源,事务管理器,mapper配置等)
创建解析器
解析每一个标签保存在Configuration中
解析maper.xml(crud标签每个属性都解析出来封装成mapperstatement)
build(Configuration)
new DefaultSqlSession()
Mybatis设计模式
建造者模式 sqlsessionFactoryBuilder,XMLConfigBuilder
工厂模式 mapperProxyFactory
单例模式 logFactory,errorcontext
代理模式 MapperProxy,ConnectionLogger
组合模式 SqlNode和子ChooseSqlNode
模板方法模式 BaseExecutor
适配器模式 log接口和对其他日志框架的适配实现
装饰者模式 cache.decorators 子包中装饰者实现
迭代器模式 PropertyTokenizer
SpringBoot自动配置
@EnableAutoConfiguration
扫描加载 spring.factories 指定路径 XXXAutoConfiguration
文件中@Condition注解条件判断
starters提供配置和依赖支持
把满足条件的bean注册到spring容器中
SpringBoot启动过程
构造springApplication对象
- 推测web类型(根据容器中的对象实例)
- 构造BootstrapRegistryInitializer对象(spring容器初始化之前的容器,用来共享对象)
- ApplicationContextInitializer用来初始化Spring容器ApplicationContext对象
- 实例化扩展的ApplicationListener对象