目录
一、前言
二、SSM起源
1、Spring
2、SpringMVC
3、MyBatis
三、SSM作用与原理
1、作用
2、Spring原理
3、SpringMVC原理
4、Mybatis原理
四、SSM重难点
1、Spring
1.1、理解IOC
1.2、主要注解
1.3、AOP
2、SpringMVC
2.1、SpringMVC原理及接口解释
2.2、常用注解
3、Mybatis
3.1、执行流程
3.2、Executor类型
3.3、MyBatis缓存机制
五、Axios
1、Axios技术原理
2、Axios特点
我们的项目使用VUE前后端分离和SSM框架,数据通过前端axios发出请求,所以讲解的技术是axios和SSM框架。
Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。 简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。SpringMVC把传统的模型层被拆分为了业务层(Service)和数据访问层(DAO,Data Access Object)。在业务层中可以通过 Spring 的声明式事务操作数据访问层,而在业务层上还允许我们访问 NoSQL ,这样就能够满足异军突起的 NoSQL 的使用了,它可以大大提高互联网系统的性能。
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis ,2013年11月迁移到Github。MyBatis 是一款优秀的Java持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML配置文件或注解,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
下面这张图简述了三者之间关系
1、作用
spring实现业务对象管理;spring MVC负责请求的转发和视图管理;mybatis作为数据对象的持久化引擎
接触的IOC容器,它可以装载bean(如Java中的类,也包括service dao里的),有了这个机制,不用每次使用此类就为它初始化,很少看到关键字new。
(1)客户端发送请求到DispacherServlet(分发器)
(2)由DispacherServlet控制器查询HanderMapping,找到处理请求的Controller
(3)Controller调用业务逻辑处理后,返回ModelAndView
(4)DispacherSerclet查询视图解析器,找到ModelAndView指定的视图
(5)视图负责将结果显示到客户端
mybatis是对jdbc的封装,它让数据库底层操作变的透明。mybatis的操作都是围绕一个sqlSessionFactory实例展开的。mybatis通过配置文件关联到各实体类的Mapper文件,Mapper文件中配置了每个类对数据库所需进行的sql语句映射。在每次与数据库交互时,通过sqlSessionFactory拿到一个sqlSession,再执行sql命令。
IOC全称是Inversion of Control,控制反转。它是一种设计思想,由容器将设计好的对象交给容器控制,而非对象内部直接new。
传统应用中是由我们自己在对象中主动控制去直接获取以来对象;反转则是通过容器来进行对象的依赖和创建,这里,对象只是被动的接收依赖对象,因此称为反转,而反转的则是依赖对象的获取被反转了。
反射和工厂模式,反射原理使得我们通过对象的描述信息可生产出完整的对象,工厂模式使得IOC代码更加松耦合更加合理的生产Bean对象。
@Component:泛指各种组件,@Controller、@Service、@Repository都可以称为@Component。
@Controller:控制层
@Service:业务层
@Repository:数据访问层
@Bean:导入第三方包里面的注解;注解在方法上,声明当前方法的返回值为一个bean,替代xml中的方式;
@Autowired:由bean提供;@Autowired可以作用在变量、setter方法、构造函数上;有个属性为required,可以配置为false;
@ComponentScan:用于对Component进行扫描;
AOP(面向切面编程),可以说是OOP(面向对象编程)的补充和完善。OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力。也就是说,OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系。
例如日志功能。日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系。对于其他类型的代码,如安全性、异常处理和透明的持续性也是如此。这种散布在各处的无关的代码被称为横切代码,在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。
虽然AOP也是spring的重点内容,但在现学习阶段还未过多接触AOP,所以后续不再赘述该项。
DispatcherServlet接口:
Spring提供的前端控制器,所有的请求都有经过它来统一分发。在DispatcherServlet将请求分发给Spring Controller之前,需要借助于Spring提供的HandlerMapping定位到具体的Controller。
HandlerMapping接口:
能够完成客户请求到Controller映射。
Controller接口:
需要为并发用户处理上述请求,因此实现Controller接口时,必须保证线程安全并且可重用。Controller将处理用户请求,这和Struts Action扮演的角色是一致的。一旦Controller处理完用户请求,则返回ModelAndView对象给DispatcherServlet前端控制器,ModelAndView中包含了模型(Model)和视图(View)。
从宏观角度考虑,DispatcherServlet是整个Web应用的控制器;从微观考虑,Controller是单个Http请求处理过程中的控制器,而ModelAndView是Http请求过程中返回的模型(Model)和视图(View)。
ViewResolver接口:
Spring提供的视图解析器(ViewResolver)在Web应用中查找View对象,从而将相应结果渲染给客户。
1、@EnableWebMvc
在配置类中开启Web MVC的配置支持。
2、@Controller
3、@RequestMapping
用于映射web请求,包括访问路径和参数。
4、@ResponseBody
支持将返回值放到response内,而不是一个页面,通常用户返回json数据。
5、@RequestBody
允许request的参数在request体中,而不是在直接连接的地址后面。(放在参数前)
6、@PathVariable
用于接收路径参数,比如@RequestMapping(“/hello/{name}”)声明的路径,将注解放在参数前,即可获取该值,通常作为Restful的接口实现方法。
7、@RestController
该注解为一个组合注解,相当于@Controller和@ResponseBody的组合,注解在类上,意味着,该Controller的所有方法都默认加上了@ResponseBody。
8、@ControllerAdvice
全局异常处理;全局数据绑定;全局数据预处理
MyBatis的执行流程分为8个步骤
1、读取MyBatis的核心配置文件,其中配置了数据库连接、属性、类型别名、类型处理器、插件、环境配置、映射器等信息,这个过程中有一个比较重要的部分就是配置映射文件。最终这个核心配置文件会被封装成一个Configuration对象
2、加载映射文件,即SQL映射文件,该文件中配置了操作数据库的SQL语句,映射文件在核心配置文件中加载。常见的配置方式有两种,一种是包扫描,另一种是mapper找到配置文件的位置
3、构造会话工厂获取SqlSessionFactory
4、创建会话对象SqlSession。由会话工厂创建SqlSession对象,对象中包含了执行 SQL语句的所有方法,每个线程都应该有他自己的SqlSession实例。SqlSession的实例不是线程安全的,因此是不能被共享的
5、Executor执行器,是MyBatis的核心,负责SQL语句的生成和查询缓冲的维护,它将根据SqlSession传递的参数动态地生成需要执行的SQL语句
6、MappedStatement对象,它是对解析的SQL的封装,一个MappedStatement代表了一个SQL语句标签
7、输入参数映射。输入的参数类型可以是基本数据类型,也可以是Map、List、POJO等复杂数据类型。这个过程类似于JDBC的预编译处理参数的过程,有两个属性parameterType和parameterMap
8、封装结果集。可以封装成多种类型,可以是基本类型,也可以是Map、List、POJO等复杂数据类型。封装结果集的过程和JDBC一样,有两个常用的属性resultType和resultMap
SimpleExecutor
每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象
ReuseExecutor
执行update或select时,以SQL作为key查找Statement对象,存在就使用,不存在就创建,用完后,不会关闭Statement对象,而是放在Map内,供下一次使用
BatchExecutor
执行update(不能执行select,JDBC批处理不支持select),将所有SQL都添加到批处理中,等待统一执行,它缓存了多个Statement对象,每个Statement对象都是在SQL添加完毕后,等待注意执行批处理
CachingExecutor
CachingExecutor是一个Executor的装饰器,它为Executor对象增加了二级缓存的相关功能,委托的执行器对象可以是SimpleExecutor、ReuseExecutor、BatchExecutor中的任意一个。执行update方法前会判断是否清空二级缓存,执行query方法前会先在二级缓存中查询,命中失败再通过被代理类查询
1、一级缓存
在应用运行过程中,我们有可能在一次数据库会话中,执行多次查询条件完全相同的SQL,MyBatis提供了一级缓存的方案优化这部分场景,如果是相同的SQL语句,会优先命中一级缓存,避免直接对数据库进行查询,提高了性能。在SqlSession中持有Executor,每个 Executor中有一个LocalCache。当用户发起查询时,MyBatis根据当前执行的语句生成 MappedStatement,在Local Cache 进行查询,如果缓存命中的话,直接返回结果给用户,如果缓存没有命中的话,查询数据库,结果写入Local Cache,最后返回结果给用户。
2、二级缓存
一级缓存最大的共享范围是一个SqlSession内部,如果多个SqlSession之间需要共享缓存,则需要使用到二级缓存。开启二级缓存后,会使用CachingExecutor装饰Executor,进入一级缓存的查询流程前,先在CachingExecutor进行二级缓存的查询,二级缓存开启后,同一个namespace下的所有操作语句,都影响着同一个Cache,即二级缓存被多个SqlSession共享,是一个全局的变量,具体的工作流程如下所示
axios本质上是对原生XHR的封装,只不过它是Promise的实现版本,符合最新的ES规范。axios是一个基于promise 的 http库,主要实现 ajax异步通信功能,用于向后端发起请求,还有在请求中做更多是可控功能;ajax是对原生XHR的封装;axios实现对 ajax封装,ajax实现局部数据的刷新。
选择Axios的原因: