一、初步了解

现在我们做项目会很喜欢ssm,有的人会问既然我们有Spring和Spring MVC,为什么还需要Spring Boot,但实际上,他们三者之间并不是互斥的存在,而是相互联系的,我们从一张整体的大图来看:
图片说明

1. Spring

对于Spring来讲,我们最重要的是掌握它的概念,因为它是Spring MVC、Spring Boot的基础。Spring有两个很重要的功能,意识IoC(Inversion of Control,控制反转),二是AOP(Aspect Oriented Programming,面向切面编程),在这两个功能之下,其实依托的是Spring内部很重要的两个个组件,ApplicationContext和BeanFactory。

1. IoC
IoC字面上的意思是说控制反转,是Spring用来管理Bean的,通俗来讲就是用它来完成bean的注入依赖,降低了bean之间的耦合度。而且做到“可插拔”,我们想置换掉某个bean很方便,如果是我们自己去管理这个bean的话,他们之间的耦合度会非常高,很有可能就无法置换。IoC还能管理bean的生与死,就是生命周期。

IoC的实现是依赖底层的两个工厂BeanFactory和AppliactionContext,BeanFactory是最底层的结构,一般是给开发Spring这个框架的人使用的,而AppliactionContext是它的间接子类,使用应用类,一般是给项目开发人员用的。AppliactionContext核心的功能就是获取bean。

Spring Boot会在你项目的包下,创建一个入口类,如图,命名为包名+Appliaction
图片说明
那么它都做了什么事情,如图
图片说明

2. AOP
面向切面编程这是个很复杂的概念,它是用来批量处理bean,它能统一记日志,统一处理事务,如图所示:
图片说明
我们将需要处理的类称为Target,它里面包含连接点JoinPoint,代表需要处理的方法。切面Aspect里有切点PointCut,就是我们用来描述JoinPoint的方法们(* service..(..)表示service包下所有类所有方法所有参数及所有返回值),还有一个通知Advice,用来告知什么时候处理,织入到连接点(就是悄悄写进)。
织入的方式有三种:

  • 编译时织入,需要使用特殊的编译器(很麻烦)
  • 类装载时织入,需要使用特殊的类装载器(也很麻烦)
  • 运行时装入,需要为目标生成代理对象(相对简单)
    Spring AOP采用第三种方式,有接口的时候采用JDK动态代理,无接口的时候采用CGLIB动态代理。

为什么实体类不用容器来管理?
一般可以复用的我们才用容器来管理,如果是单例的我们就不用容器来管理,比如User类,每个user的属性都不一样,怎么用容器来管理。

2. Spring MVC

对于Spring MVC来讲,我们就需要重点掌握它的流程。Spring MVC中有三个非常重要的组件,一是Intercepor(拦截器),二是Controller(控制器),三是DispatcherServlet(前端控制器)。

1. DispatcherServlet
图片说明

DispatcherServlet是前端控制器,是Spring MVC的核心组件,用来处理前端发来的请求并返回结果。如上图所示,前端发来的request请求先被DispatcherServlet接收,这request里面包含了路径参数,但是DispatcherServlet并不知道哪个bean保存了这路径,所以它需要借助HandlerMapping,HandlerMapping里面记录了bean和路径的对应关系,但是它不是返回一个字符串给DispatcherServlet,它返回了一个HandlerExecutionChain,这里面包含了很多的mapping,DispatcherServlet从中得知要去处理适配器HandlerAdapter里找,然后将ModelAndView对象返回给DispatcherServlet,DispatcherServlet再通过视图解析器ViewResolver去渲染数据,最后将view页面返回给前端。当然如果你用的ajax异步请求,那就不用ViewResolver,也不会生成ModelAndView对象,HandlerAdapter会直接将数据返回给前端,但你需要一个请求体注解ResponseBody,这样返回的数据会封装到请求体里。
DispatcherServlet会做三次拦截,第一次是在请求HandlerAdapter之前,第二次是在请求HandlerAdapter之后,第三次是ViewResolver给DispatcherServlet返回View之后。

从源码上看DispatcherServlet中有个doDispatch方法,他会调用getHandler这个方法,然后它得到了一个HandlerExecutionChain,这里面就封装了bean和路径的关系,然后调用getHandlerAdapter,得到HandlerAdapter后调用handler方法得到mv,也就是ModelAndView对象,然后processModelAndView去处理,如果mv不为空,就render渲染,通过viewResolver去找到模板引擎,把数据装载进去。

3. Spring Boot

其实Spring Boot是个可有可无的东西,你没有它,这个项目也可以运行起来,但如果你用它,就会很便捷。很多人一开始就接触Spring Boot,就不会知道在那个古老的年代,部署这些配置文件的繁琐,例如配置web-xml等,没有这些配置文件项目根本跑步起来,但是使用了Spring Boot,就完全不需要你自己的去配置这些文件,但是它是如何神奇解决这一问题的呢?所以对于Spring Boot我们更重要的是去学习他的功能,诸如构建项目、自动配置和独立运行。
1. 构建项目
Spring Boot构建项目快是因它把我们项目所需的包都放在了starter里
图片说明

2. 自动配置
这里我们通过Mybatis来讲解Spring Boot的自动配置,因为项目要连接数据库,那一定要配置数据库信息了。
图片说明
如上图所示,Mybatis连接数据库需要SqlSession,那么其实在Mybatis中SqlSession是依赖一个SqlSessionFactory工厂,那么SqlSessionFactory(封装了dataSource,依赖dataSource)就要知道数据库的连接信息,它从那得来这个连接信息呢?通过Configuration,Configuration其实通过扫描application.properties得到配置信息。除了SqlSession我们还需要Mapper接口,我们还需要写一个Mapper.xml的映射文件,用来映射SQL语句的,那么我们有了接口,还需要实现类,在MyBatis中,它通过MapperProxy动态代理Mapper的实现类,但实际上并不是由他生成实现类,他做的只是一个动态代理。我们还需要一个Mapper.xml的映射文件,来映射SQL语句,前面说的Configuration配置器也会读取Mapper.xml。

也许我们会问,我们在项目中并没有创建SqlSessionFactroy这个工厂,他是从哪里来的呢?实际上,在Spring Boot中,有个MyBatisAutoConfiguration会在程序启动的时候,自动创建SqlSessionFactroy,它还会创建一个MapperScannerConfigurer来映射扫描配置器,来扫描Mapper接口。

我们最好从源码的角度来理解,以后我会补充...

3. 独立运行
Spring Boot能够独立运行是因为它内嵌了Tomcat

二、demo实例

我用一个小的demo来更深入的讲解这三个框架。

1. 用Spring Boot来构建一个简单的项目

打开https://start.spring.io/ 网站,这是Spring初始化的网站,有了这个网站我们就不需要自己搭建框架,它直接生成了,非常快捷。

图片说明

未完待续...