更多内容,欢迎关注微信公众号:全菜工程师小辉~

Spring的优势?

  1. 降低了组件之间的耦合性 ,实现了软件各层之间的解耦
  2. 可以使用容易提供的众多服务,如事务管理,消息服务等
  3. 容器提供单例模式支持
  4. 容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能
  5. Spring的IoC机制降低了业务对象替换的复杂性
  6. 容器提供了众多的辅助类,能加快应用的开发
  7. Spring对于主流的应用框架提供了集成支持,如Hibernate,JPA,Mybatis等
  8. Spring属于低侵入式设计,代码的污染极低, 并且独立于各种应用服务器
  9. 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的过程?

  1. 基础包扫描。读取配置文件,然后根据配置路径进行全包扫描,,最后将扫描到的类名加上全限定名之后加入到数组集合中
  2. 实例化所有带注解的类。遍历上一步的数组集合,判断类上的注解并实例化该类,以该类的类名为key,实例为value,放入哈希表中
  3. 依赖注入。遍历上一步的哈希表,获取类上所有Fields,遍历Fields,判断Fields上是否为@Autowired类型的注解,如果是的话就把Map中的实例赋值这个field
  4. Url地址和方法映射。遍历第二步的哈希表,如果是Controller实例,获取Methods并遍历,判断方法上是否含有@RequestMapping注解,如果含有,则获取它的值,将@Controller的注解值拼接上@RequestMapping值组成key,当前method作为value,装入hanlerMap中

  5. 请求反射调用。(这一步已经属于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的流程

流程图说明:

  1. 用户发送请求至 前端控制器DispatcherServlet。
  2. 前端控制器DispatcherServlet收到请求后调用处理器映射器HandlerMapping。
  3. 处理器映射器HandlerMapping根据请求的Url找到具体的处理器,生成处理器对象Handler及处理器拦截器HandlerIntercepter(如果有则生成)一并返回给前端控制器DispatcherServlet。
  4. 前端控制器DispatcherServlet通过处理器适配器HandlerAdapter调用处理器Controller。
  5. 执行处理器(Controller,也叫后端控制器)
  6. 处理器Controller执行完后返回ModelAndView。
  7. 处理器映射器HandlerAdapter将处理器Controller执行返回的结果ModelAndView返回给前端控制器DispatcherServlet。
  8. 前端控制器DispatcherServlet将ModelAnView传给视图解析器ViewResolver。
  9. 视图解析器ViewResolver解析后返回具体的视图View。
  10. 前端控制器DispatcherServlet对视图View进行渲染视图(即:将模型数据填充至视图中)
  11. 前端控制器DispatcherServlet响应用户。

MVC流程中的模块:

  1. DispatcherServlet:前端控制器(不需要程序员开发)
    用户请求到达前端控制器,它相当于MVC模式中的C(Controller),DispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,DispatcherServlet的存在降低了组件之间的耦合性。
    作用:作为接受请求,相应结果,相当于转发器,中央处理器,减少其他组件之间的耦合度。
  2. HandlerMapping:处理器映射器(不需要程序员开发)
    HandlerMapping负责根据用户请求找到Handler(即:处理器),SpringMVC提供了不同的映射器实现实现不同的映射方式,例如:配置文件方式、实现接口方式、注解方式等。
    作用:根据请求的Url 查找Handler
  3. Handler:处理器(需要程序员开发)
    Handler是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下,Handler对具体的用户请求进行处理。
    由于Handler设计到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发Handler。
  4. HandlerAdapter:处理器适配器
    通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。
    作用:按照特定的规则(HandlerAdapter要求的规则)去执行Handler
  5. ViewResolver:视图解析器(不需要程序员开发)
    ViewResolver负责将处理结果生成View视图,ViewResolver首先根据逻辑视图名解析成物理视图名,即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面的展示给用户。SpringMVC框架提供了很多View视图类型,包括:JSTLView、freemarkerView、pdfView等等。
    作用:进行视图解析,根据逻辑视图名解析成真正的视图(view)。
  6. View视图 (需要程序员开发 jsp)
    View是一个接口,实现类支持不同的View类型(jsp、freemarker等)一般情况下需要通过页面标签或者页面模板技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。

SpringIoC和SpringMVC的快速入门的更多相关文章

  1. SpringMVC - 1.快速入门

    1. HelloWorld 步骤: 加入 jar 包 mons-logging-1.1.3.jar spring-aop-4.0.0.RELEASE.jar spring-beans-4.0.0.RE ...

  2. [jbdj]SpringMVC框架(1)快速入门

    1)springmvc快速入门(传统版) 步一:创建springmvc_demo一个web应用 步二:导入springioc,springweb , springmvc相关的jar包 步三:在/WEB ...

  3. springmvc快速入门(注解版本)

    1)springmvc快速入门(传统版) 步一:创建springmvc-day02这么一个web应用 步二:导入springioc,springweb和springmvc相关的jar包 ------- ...

  4. springmvc快速入门(XML版本)

    1)springmvc快速入门(传统版) 步一:创建springmvc-day01这么一个web应用 步二:导入springioc,springweb , springmvc相关的jar包 步三:在/ ...

  5. SpringMVC:学习笔记(1)——理解MVC及快速入门

    SprigMVC-理解MVC及快速入门 说明: 传统MVC-->JSPModel2-->Front Controller + Application Controller + Page C ...

  6. SpringMVC 快速入门

    SpringMVC 快速入门 SpringMVC 简介 SpringMVC是 Spring为展示层提供的基于Web MVC设计模式的请求驱动类型的轻量级Web框架,它的功能和Struts2一样.但比S ...

  7. springMVC学习总结(一)快速入门

    springMVC学习总结(一)快速入门 一.初步认识 springMVC执行流程 主要组件 DispatcherServlet(中央控制器) 配置在web.xml中的前端控制器,客户端请求的入口,调 ...

  8. JAVA WEB快速入门之从编写一个基于SpringBoot+Mybatis快速创建的REST API项目了解SpringBoot、SpringMVC REST API、Mybatis等相关知识

    JAVA WEB快速入门系列之前的相关文章如下:(文章全部本人[梦在旅途原创],文中内容可能部份图片.代码参照网上资源) 第一篇:JAVA WEB快速入门之环境搭建 第二篇:JAVA WEB快速入门之 ...

  9. JAVA WEB快速入门之从编写一个基于SpringMVC框架的网站了解Maven、SpringMVC、SpringJDBC

    接上篇<JAVA WEB快速入门之通过一个简单的Spring项目了解Spring的核心(AOP.IOC)>,了解了Spring的核心(AOP.IOC)后,我们再来学习与实践Maven.Sp ...

随机推荐

  1. Excel催化剂开源第32波-VSTO开发的插件让WPS顺利调用的方法-注册表增加注册信息

    VSTO插件开发完成后,鉴于现在WPS用户也不少,很多时候用户没办法用OFFICE软件,只能在WPS环境下办公,VSTO开发的插件,只需增加一句注册表信息,即可让WPS识别到并调用VSTO开发的功能, ...

  2. 个人永久性免费-Excel催化剂功能第19波-Excel与Sqlserver零门槛交互-查询篇

    对频繁使用Excel的高级应用的尝试用户来说,绕不过的一个问题Excel的性能问题,对于几万条数据还说得过去,上了10万行的数据量,随便一个函数公式的运算都是一个不小的负荷,有些上进一点的用户会往Ac ...

  3. [PTA] 数据结构与算法题目集 6-10 二分查找

    Position BinarySearch(List L, ElementType X) { int beg = 1; int end = L->Last; while (beg <= e ...

  4. 利用DOMNodeInserted监听标签内容变化

    var exeFlag = 0;//控制执行业务次数标记$('#list1').bind('DOMNodeInserted', function () { if(!/img/.test($(" ...

  5. HTML 去调table表单里面td之间的间距

    首先为大家展示一下最原始的代码和效果.直接在table中用td划分的表格会默认隐藏边框.  接下来我们用css来增加样式,为table增加边框. table { border: 1px solid # ...

  6. 解读Android MediaPlayer 详细使用方法

        MediaPlayer具有非常强大的功能,对音视频的播放均提供了支持,为了保证播放期间系统的正常工作,需要设置"android.permission.WAKE_LOCK"权 ...

  7. springboot-权限控制shiro(一)

    1. 场景描述 (1)权限控制是IT项目特别是企业项目,绕不开的重要模块,接下来结合springboot介绍下权限控制框架shiro. (2)springboot集成shiro的东西有点多,一篇博客完 ...

  8. 基于高德开放平台的 NODE 天气信息组件

    看看了画在手上的Armani手表,马上就快到了下班的时间了,心里总觉的空唠唠的, 好像空缺了什么一样,仔细的想了一想,微微叹了一口气,觉得是时候在这里和大家分享一下原因了........ 首先: ## ...

  9. Web安全之CSRF攻击(转载)

    CSRF是什么? CSRF(Cross Site Request Forgery),中文是跨站点请求伪造.CSRF攻击者在用户已经登录目标网站之后,诱使用户访问一个攻击页面,利用目标网站对用户的信任, ...

  10. 【iOS】更新 CocoaPods 后 Podfile 报错

    更新了 CocoaPods 后,再执行 "pod install" 时报了如下错误: [!] The dependency `AFOnoResponseSerializer` is ...