共计 3133 个字符,预计需要花费 8 分钟才能阅读完成。
更多内容,欢迎关注微信公众号:全菜工程师小辉~
Spring 的优势?
- 降低了组件之间的耦合性,实现了软件各层之间的解耦
- 可以使用容易提供的众多服务,如事务管理,消息服务等
- 容器提供单例模式支持
- 容器提供了 AOP 技术,利用它很容易实现如权限拦截,运行期监控等功能
- Spring 的 IoC 机制降低了业务对象替换的复杂性
- 容器提供了众多的辅助类,能加快应用的开发
- Spring 对于主流的应用框架提供了集成支持,如 Hibernate,JPA,Mybatis 等
- Spring 属于低侵入式设计,代码的污染极低, 并且独立于各种应用服务器
- Spring 的高度开放性,并不强制应用完全依赖于 Spring,开发者可以自由选择 spring 的部分或全部。
为什么本文不讲 AOP?
IoC 和 AOP 是 Spring 框架的两大特性,IoC 和 MVC 的流程密不可分,可以看作是面向对象编程的实现;而 AOP 特性则是面向切面编程的体现,也是前者的补充,所以可以拆分开后续讲解。
本文对 SpringIoC 和 SpringMVC 的流程进行了简单的讲解,更加详细的过程,欢迎看笔者的代码库,里面几乎每行代码都做了详细注释,一个请求 debug 跟下来,过程就一目了然了。
快戳我,我们去学习~
什么是 SpringIoC?
控制反转 IoC(Inversion of Control),是一种设计思想。没有 IoC 的程序中我们使用面向对象编程对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,而使用控制反转后,将对象的创建转移给第三方。
IoC 是 Spring 框架的核心内容,使用多种方式完美的实现了 IoC,可以使用 XML 配置,也可以使用注解,新版本的 Spring 也可以零配置实现 IoC。Spring 容器在初始化时先读取配置文件,根据配置文件或元数据创建与组织对象存入容器中,程序使用时再从 IoC 容器中取出需要的对象。
采用 XML 方式配置 Bean 的时候,Bean 的定义信息是和实现分离的,而采用注解的方式可以把两者合为一体,Bean 的定义信息直接以注解的形式定义在实现类中,从而达到了零配置的目的。
SpringIoC 的过程?
- 基础包扫描。读取配置文件,然后根据配置路径进行全包扫描,,最后将扫描到的类名加上全限定名之后加入到数组集合中
- 实例化所有带注解的类。遍历上一步的数组集合,判断类上的注解并实例化该类,以该类的类名为 key,实例为 value,放入哈希表中
- 依赖注入。遍历上一步的哈希表,获取类上所有 Fields,遍历 Fields,判断 Fields 上是否为 @Autowired 类型的注解,如果是的话就把 Map 中的实例赋值这个 field
- Url 地址和方法映射。遍历第二步的哈希表,如果是 Controller 实例,获取 Methods 并遍历,判断方法上是否含有 @RequestMapping 注解,如果含有,则获取它的值,将 @Controller 的注解值拼接上 @RequestMapping 值组成 key,当前 method 作为 value,装入 hanlerMap 中
- 请求反射调用。(这一步已经属于 MVC 范畴) 一个 url 请求过来,获取它的地址,拆分,获取 Controller 实例,获取 Method 实例,反射执行 Method
什么是 SpringMVC?
SpringMVC 框架是以请求为驱动,围绕 Servlet 设计,将请求发给控制器,然后通过模型对象,分派器来展示请求结果视图。其中核心类是 DispatcherServlet,它是一个 Servlet,顶层是实现的 Servlet 接口。
为什么要用 SpringMVC?
框架的作用一直都是用来简化编程的:
servlet 只有 doGet 和 doPost,一个 servlet 类只能处理一个 url-pattern。
SpringMVC 类里面可以通过 RequestMapping 处理很多请求,并且支持 Rest 风格的请求,如 DELETE/PUT 等;SpringMVC 参数的映射可以直接封装成实体类。
SpringMVC 的流程
流程图说明:
- 用户发送请求至 前端控制器 DispatcherServlet。
- 前端控制器 DispatcherServlet 收到请求后调用处理器映射器 HandlerMapping。
- 处理器映射器 HandlerMapping 根据请求的 Url 找到具体的处理器,生成处理器对象 Handler 及处理器拦截器 HandlerIntercepter(如果有则生成)一并返回给前端控制器 DispatcherServlet。
- 前端控制器 DispatcherServlet 通过处理器适配器 HandlerAdapter 调用处理器 Controller。
- 执行处理器(Controller,也叫后端控制器)
- 处理器 Controller 执行完后返回 ModelAndView。
- 处理器映射器 HandlerAdapter 将处理器 Controller 执行返回的结果 ModelAndView 返回给前端控制器 DispatcherServlet。
- 前端控制器 DispatcherServlet 将 ModelAnView 传给视图解析器 ViewResolver。
- 视图解析器 ViewResolver 解析后返回具体的视图 View。
- 前端控制器 DispatcherServlet 对视图 View 进行渲染视图(即:将模型数据填充至视图中)
- 前端控制器 DispatcherServlet 响应用户。
MVC 流程中的模块:
- DispatcherServlet:前端控制器(不需要程序员开发)
用户请求到达前端控制器,它相当于 MVC 模式中的 C(Controller),DispatcherServlet 是整个流程控制的中心,由它调用其它组件处理用户的请求,DispatcherServlet 的存在降低了组件之间的耦合性。
作用:作为接受请求,相应结果,相当于转发器,中央处理器,减少其他组件之间的耦合度。
- HandlerMapping:处理器映射器(不需要程序员开发)
HandlerMapping 负责根据用户请求找到 Handler(即:处理器),SpringMVC 提供了不同的映射器实现实现不同的映射方式,例如:配置文件方式、实现接口方式、注解方式等。
作用:根据请求的 Url 查找 Handler
- Handler:处理器(需要程序员开发)
Handler 是继 DispatcherServlet 前端控制器的后端控制器,在 DispatcherServlet 的控制下,Handler 对具体的用户请求进行处理。
由于 Handler 设计到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发 Handler。
- HandlerAdapter:处理器适配器
通过 HandlerAdapter 对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。
作用:按照特定的规则(HandlerAdapter 要求的规则)去执行 Handler
- ViewResolver:视图解析器(不需要程序员开发)
ViewResolver 负责将处理结果生成 View 视图,ViewResolver 首先根据逻辑视图名解析成物理视图名,即具体的页面地址,再生成 View 视图对象,最后对 View 进行渲染将处理结果通过页面的展示给用户。SpringMVC 框架提供了很多 View 视图类型,包括:JSTLView、freemarkerView、pdfView 等等。
作用:进行视图解析,根据逻辑视图名解析成真正的视图(view)。
- View 视图(需要程序员开发 jsp)
View 是一个接口,实现类支持不同的 View 类型(jsp、freemarker 等)一般情况下需要通过页面标签或者页面模板技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。