1. 上手追踪下源码,自己画一遍循环依赖流程图/时序图(上节课内容)
循环依赖
多个Bean之间对象属性相互依赖成环,造成死循环,有些情况能够解决,有些情况无法解决
- 无法解决:单例bean构造器参数循环依赖、prototype原型bean循环依赖(都是连对象都无法生成)
- 可以解决:单例bean set注入或者@Autowired(可以先生成对象,再注入依赖的属性)
IOC的解决方案
使用三级缓存,把创建好的对象、创建未完成的对象、待创建的对象放在不同级别的缓存中
三级缓存
SingletonObjects(单例池):存放完成成型的bean
earlySingletonObjects(二级缓存):存放已经被创建,但是还未进行依赖注入的bean
singletonFactories(三级缓存):存放还未被真正创建,只是存在对应工厂的bean
流程图,以ClassA与ClassB之间循环依赖为例,依赖注入都是使用set
SpringIOC循环依赖解决
2. SpringMvc的运行流程
DispatcherServlet
前端控制器,相当于MVC模式中的C,是整个流程控制的重心,它调度其他组件处理用户的请求,降低了各个组件之间的耦合性
HandlerMapping
处理器映射器,根据用户请求找到具体的Handler处理器,可以通过配置文件、实现接口、注解三种方式来实现HandlerMapping
HandlerAdapter
处理器适配器,适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行
Handler【开发者核心编写内容】
处理器,具体业务控制器,由DispatcherServlet把用户请求通过HandlerAdaoter交到合适的Handler,再有Handler对具体的用户请求进行处理
ViewResolver
视图解析器,负责将处理结果生成View视图,首先根据逻辑视图名解析生成物视图名,即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户
View【开发者核心编写内容】
视图,SpringMVC框架提供了很多View视图类型的支持,包括jstlView、freemarkerView、pdfView等。最常用的视图就是jsp。一般情况下需要通过页面标签或页面模板技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面
3. SpringBoot和SpringFramework的关系
SpringBoot是SpringFramework的一套快速配置脚手架,简化了Spring使用中大量繁杂的配置过程,它的功能有:
- jar包自动依赖且版本匹配,大幅度减少依赖冲突的可能性
- 从xml配置转java配置,提供默认配置,甚至可以0配置接入