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

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跟下来,过程就一目了然了。

github地址:https://github.com/y277an/java-you-need-know/tree/master/spring-ioc-mvc

什么是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执行完后返回ModelAnView。
  7. 处理器映射器HandlerAdapter将处理器Controller执行返回的结果ModelAndView返回给前端控制器DispatcherServlet。
  8. 前端控制器DispatcherServlet将ModelAnView传给视图解析器ViewResolver。
  9. 视图解析器ViewResolver解析后返回具体的视图View。
  10. 前端控制器DispatcherServlet对视图View进行渲染视图(即:将模型数据填充至视图中)
  11. 前端控制器DispatcherServlet响应用户。

MVC流程中的模块:

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

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

springmvc默认方法名为映射名_SpringIoC和SpringMVC的快速入门相关推荐

  1. 测试英语发音的软件,零基础英语app排行榜前五名,从音标手把手教你怎么快速入门!...

    前几天有个网友咨询我,零基础英语app有什么好的推荐,有没有关于这方面的排行榜.今天小词君就把自己知道的5款适合零基础学习的英语app做成排行榜推荐给大家.这5款app个有侧重,有适合特别特别小白的, ...

  2. Java接口、implements关键字、接口中抽象方法,默认方法,静态方法,私有方法,常量、final关键字

    接口: 接口是Java语言中一种引用类型,是方法的集合,如果说类的内部封装了成员变量.构造方法和成员方法,那么 接口的内部主要就是封装了方法,包含抽象方法(JDK 7及以前),默认方法和静态方法(JD ...

  3. java8 方法引用详解_Java8中如何通过方法引用获取属性名详解

    前言 在我们开发过程中常常有一个需求,就是要知道实体类中Getter方法对应的属性名称(Field Name),例如实体类属性到数据库字段的映射,我们常常是硬编码指定 属性名,这种硬编码有两个缺点. ...

  4. SSM_Mybatis_Day01(快速入门、映射文件概述、核心配置文件概述、相应API、代理开发方式、映射文件深入、数据类型的映射、列名和属性名不一致的时候的处理)

    SSM_Mybatis_Day01(快速入门.映射文件概述.核心配置文件概述.相应API.代理开发方式.映射文件深入.数据类型的映射.列名和属性名不一致的时候的处理) 1. Mybatis mybat ...

  5. oracle怎么查别的库,ORACLE_SID、实例名和数据库名的区别及查看方法

    ORACLE_SID.实例名和数据库名的区别及查看方法 ORACLE_SID.实例名和数据库名的区别及查看方法 1.ORACLE_SID.实例名(SID)和数据库名的区别 操作系统环境变量(ORACL ...

  6. 在Mybaties中进行数据查询时,表中字段名和属相名没有对应起来,查询的结果总null,一下是解决方法

    http://blog.csdn.net/jiangsanfeng1111/article/details/49763135 在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同 ...

  7. Mybatis处理字段名和属性名不一致的几种方法

    Mybatis处理字段名和属性名不一致的几种方法 1.为查询的字段设置别名,和属性名保持一致2.当字段符合MySQL的要求使用,而属性符合Java的要求使用驼峰-此时可以在mybatis核心配置文件中 ...

  8. SQL Server2019数据库查询所有数据库名、表名、表结构、表字段、主键方法演示,执行sql提示对象名‘user_tab_columns‘、 ‘user_cons_columns‘ 无效问题解决

    SQL Server2019 数据库查询所有数据库名.表名.表结构.表字段.主键方法演示 第一章:查询方法 ① 查询所有数据库名 ② 查询所有表名方法 ③ 查询表结构.表字段方法 ④ 查询主键方法 第 ...

  9. 六种方法,做一名更好的开发者

    六种方法,做一名更好的开发者 2008-12-13 23:38 1.       交谈 尽可能多地跟其他软件开发者交谈:培养个人关系:跟意见与你相左的人交流:跟经验更丰富的人交流:跟阅历丰富的人交流. ...

最新文章

  1. MySQL面试题 | 附答案解析(十七)
  2. C# 复制幻灯片(包括格式、背景、图片等)到同/另一个PPT文档
  3. java hashmap 转对象_Java – 从HashMap中获取正确的转换对象
  4. CString .Format
  5. 虚拟机VMware搭建代码环境
  6. Unix domain socket IPC
  7. php textarea换行
  8. 三星魔术师助手v5.3.1_Cinemachine 2.6为您带来精度,改进的工作流程和一点点魔术
  9. STM32CubeMonitor使用教程
  10. 2021-02-01 25 个常用 Matplotlib 图的 Python 代码
  11. 洛谷 P1097 统计数字
  12. javaEE 后台框架 SpringMVC Mybatis Shiro druid
  13. iOS 系统权限配置
  14. 面试官最爱提的15个问题
  15. win10可用空间新建卷提示磁盘上没有足够的空间完成此操作如何解决
  16. delphi中setTimer函数的用法
  17. Python线程详解
  18. zero(全志V3S)-32MB Flash移植
  19. Wireshark配置显示IP地理位置信息
  20. Win10永久修改命令提示符cmd的默认当前页码页为936(简体中文 GBK)

热门文章

  1. 循环计数_FOR 循环
  2. c语言设计阶段作业答案,C语言程序设计阶段考试练习题(答案)
  3. python shell 继承 环境变量_Python subprocess shell 丢失环境变量 | 学步园
  4. 6种不同画法画平行线_今年超火的Prada Hobo,原来有6种不同
  5. java并发测试 线程池,Java并发编程——线程池
  6. 事务超时时间无效_Java面试题:Spring事务面试考点的集合整理。建议收藏阅读...
  7. html中如何华直角坐标系,空间直角坐标系的画法..ppt
  8. Oracle11g新特性:在线操作功能增强-Oracle11g在线重建索引功能增强 (转载)
  9. 贪吃蛇代码c 语言,刚学C语言,想写一个贪吃蛇的代码
  10. android静态动画,LayoutAnimation给ListView中的item设置动态出场效果(实例)