我们首先还是先来介绍一下 Spring,Spring Boot,Spring MVC。了解一下他们都是做什么的,解决了什么问题,我们才能清楚的理解他们之间的区别和联系。
先上结论!!!
解释过程在下面。
结论
Spring 是一个框架,Spring MVC 是 Spring 的一个模块,一个 web 框架,Spring Boot则是一个 Spring 的快速开发整合包。
概念
- 应用程序:是能完成我们所需要的功能的成品,比如购物网站、OA系统。
- 框架:是能完成一定功能的半成品。比如我们可以使用框架进行购物网站开发,框架做一部分功能,我们做一部分功能,这样应用程序就创建出来了。而且框架规定了你在开发应用程序时的整体结构,提供了一些基础功能,还规定了类和对象的如何创建、如何协作等。从而简化我们开发,让我们专注于业务逻辑开发。
- 非侵入式设计:从框架角度可以这样理解,无需继承框架提供的类,这种设计就可以看作是非侵入式设计,如果继承了这些框架类,就是侵入设计,如果以后想更换框架,之前写过的代码几乎无法重用,如果是非侵入式设计,则之前写过的代码仍然可以继续使用。
- 轻量级和重量级:轻量级是相对于重量级而言的,轻量级一般就是非侵入性、所依赖的东西非常少、资源占用非常少、部署简单等等,其实就是比较容易使用,而重量级正好相反。
- POJO:POJO(Plain Old Java Objects)简单的 Java 对象。POJO的内在含义是指那些没有从任何类继承、也没有实现任何接口,更没有被其他框架侵入的 Java 对象。POJO 有无参构造函数,每个字段都有 getter 和 setter 的 Java 类。
- 容器:在日常生活中容器就是一种盛放东西的器具,从程序设计角度看就是装对象的对象,因为存在放入、拿出等操作,所以容器还要管理对象的生命周期。
- 控制反转:IoC(Inversion of Control),控制反转还有另外一个名字叫做依赖注入(Dependency Injection)。就是以前程序控制对象,现在由框架控制。
- 脚手架:建筑上的脚手架就是先搭个架子,然后工人们慢慢往里面砌砖头,直到建筑成型。编程中的脚手架可以理解为有个空架子把环境配置、各种依赖都搭建好,要创建新项目的时候拿来直接往里面添加新项目需要的东西。
Spring、Spring MVC 和 Spring Boot
Spring
什么是 Spring
一句话,Spring 是一个开发应用框架,什么样的框架呢,有这么几个标签:轻量级、非侵入式、一站式、模块化,其目的是用于简化企业级应用程序开发。
目的
- 为了简化企业级应用程序开发
做了什么
Spring 除了不能帮我们写业务逻辑,其余的几乎都能帮助我们简化开发。
管理对象,以及对象之间的依赖关系
传统程序开发,创建对象及组装对象间依赖关系由我们在程序内部进行控制,这样会加大各个对象间的耦合,如果我们要修改对象间的依赖关系就必须修改源代码,重新编译、部署。而如果我们采用 Spring,则由 Spring 根据配置文件来进行创建及组装对象间依赖关系,只需要修改配置文件即可,无需重新编译,所以,Spring 能帮我们根据配置文件创建及组装对象之间的依赖关系。
面向切面编程
当我们要进行一些日志记录、权限控制、性能统计等时,在传统应用程序当中我们可能在需要的对象或方法中进行,比如权限控制、性能统计,大部分代码都是重复的,这样代码中就存在大量重复代码,即时有人说我把通用部分提取出来,那必然存在调用,还是存在重复复,像性能统计我们可能只是在必要时才进行,在诊断完毕后要删除这些代码。等等。
如果采用 Spring,这些日志记录、权限控制、性能统计能从业务逻辑中分离出来,通过 Spring 支持的面向切面编程,在需要这些功能的地方动态添加这些功能,无需渗透到各个需要的方法或对象中。
即使可以通过“代理设计模式”或“包装器设计模式”,但还是需要通过编程方式来创建代理对象,还是要耦合这些代理对象,而采用 Spring 面向切面编程能提供一种更好的方式来完成上述功能,一般通过配置方式,而且不需要在现有代码中添加任何额外代码,现有代码专注于业务逻辑。所以,Spring 面向切面编程能帮助我们无耦合的实现日志记录、性能统计、安全控制。
数据库事务管理
在传统应用程序当中,我们如何来完成数据库事务管理呢?我们需要一系列“获取连接、执行SQL、提交或者回滚事务、关闭连接”操作,而且还要保证在最后一定要关闭连接,多么可怕的事情,而且也很无聊。如果采用 Spring,我们只需要获取连接,执行 SQL,其他的都交给 Spring 来管理就可以了。
第三方数据访问框架集成
Spring 提供了与第三方数据访问框架(如 Hibernate 、JPA)无缝集成,而且自己也提供了一套 JDBC 访问模板,来方便数据库访问。
第三方 Web 框架集成
Spring 提供了与第三方 Web(如Struts、JSF)框架无缝集成,而且自己也提供了一套 Spring MVC 框架,来方便 web 层搭建
优点
- 方便解耦,简化开发。使用 Spring 的 IoC 容器,将对象之间的依赖关系交给 Spring,让我们更专注于应用逻辑。
- 对主流的光甲提供了很好的集成支持,如 Hibernate、Struts2、JPA 等。
- Spring 提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能。
- Spring 的高度可开放性,并不强制依赖于 Spring,开发者可以自由选择 Spring 部分或全部
Spring MVC
什么是 MVC
MVC 是一种架构模式,MVC 是三个字母的首字母缩写,它们是 Model(模式)、View(视图)和 Controller(控制)。该模式可以把不论简单或复杂的程序,都从结构上划分为三层。
- 最上面的一层,是直接面向最终用户的“视图层"(View)。它是提供给用户的操作界面,是程序的外壳。
- 最底下的一层,是核心的”数据层“(MOdel),也就是程序需要操作的数据或者信息。
- 中间的一层,就是”控制层“(Controller),它负责根据用户从”视图层“输入的指令,选取”数据层“中的数据,然后对其进行相应的操作,产生最终结果。
每一部分都相对独立,职责单一,在实现的过程中可以专注于自身的核心逻辑。MVC 是对系统复杂性的一种合理的梳理与划分,它的思想实质就是”关注点分离“。
什么是 Spring MVC
首先是一个 MVC 框架。
其次是一个 Spring 子框架。
Spring 的 WEB MVC 框架是围绕 DispatchServlet 设计的,它把请求分配给处理程序,同时带有可配置的 处理程序映射、视图解析、本地语言、主题解析 以及 上载文件支持。应用控制器其实拆为 处理器映射器(Handler Mapping) 进行处理器处理和 视图解析器(View Resolver) 进行视图管理,页面控制器 是非常简单的 Controller 接口,只有一个方法 ModelAndView handleRequest(request, response)。Spring 提供了一个 控制器层次结构,可以派生子类。如果应用程序需要处理用户输入表单,那么可以继承 AbstractFormController,如果需要把多页输入处理到一个表单,那么可以集成 AbstractWizardFormController。
基本流程
当 web 程序启动的时候, ContextLoaderServlet 会把对应的配置文件信息读取出来,通过注入去初始化控制器 DispatchServlet。
当接收到一个 HTTP 请求的时候,ContextLoaderServlet 会让 HandlerMapping 去处理这个请求,HandlerMapping 根据请求 URL(不一定非要是 URL,完全可以自定义,非常灵活)来选择一个 Controller,然后 DispatchServlet 会在调用选定的 Controller 的 HandlerRequest 方法,并且在这个方法前后调用这个 Controller 的 1interceptor(假如有配置的话),然后返回一个视图和模型的集合 ModelAndView。框架通过 ViewResolver 来解析视图并且返回一个 View 对象,最后调用 View 的 render 方法返回到客户端
特性(优势)
- 让我们能非常简单的设计出干净的 Web 层和薄薄的 Web 层。
- 进行更简洁的 Web 层的开发。
- 天生与 Spring 框架集成(如 IoC 容器、AOP 等)。
- 提供了强大的约定大于配置的契约式编程支持。
- 能简单的进行 Web 层的单元测试。
- 支持灵活的 URL 到页面控制器的映射。
- 非常容易与其他视图技术集成,如 Velocity、FreeMarker等等,因为模型数据不放在特定的 API 里,而是放在一个 Model 里(Map 数据结构实现,因此很容易被其他框架使用)。
- 非常灵活的数据验证,格式化和数据绑定机制,能使用任何对象进行数据绑定,不必实现特定框架的 API。
- 提供一套强大的 JSP 标签库,简化 JSP 开发。
- 更加简单的异常处理。
- 对静态资源的支持。
- 支持 Restful 风格。
Spring Boot
什么是 Spring Boot
Boot 是启动的意思。
Spring Boot 并不是一个全新的框架,它不是 Spring 解决方案的一个替代品,而是 Spring 的一个封装。
什么是 starter
Starter 可以总结为一种对依赖的合成。
在没有 starter之前,加入我想要在 Spring 中使用 jpa,那我可能需要做以下操作:
- 在 Maven 中引入使用的数据库的依赖(即 JDBC 的 jar)
- 引入 jpa 的依赖
- 在 xxx.xml 中配置一些属性信息
- 反复的调试直到可以正常运行
需要注意的是,上述操作在我们每次新建一个需要用到 jpa 的项目的时候都需要重复的做一次。
但是这样操作就会带来很多问题:
- 如果过程比较繁琐,这样一步步操作会增加出错的可能性
- 不停地 copy&paste,不符合 Don't repert yourself 精神
- 在第一次配置的时候(尤其如果开发者比较小白),需要花费掉大量的时间
starter 主要目的就是为了解决上述问题。
starter 的理念是 starter 会把所有用到的依赖都给包含进来,避免了开发者自己去引入依赖所带来的麻烦。
为什么用 boot?
免费开源。中小型企业,没有成本研究自己的框架,boot 功能全也能快速搭建项目,降低开发成本。
其他语言的简易化,给 java 造成的冲击,再不改善,就会被抛弃了,催生了这款脚手架的诞生。
优点
- 使业务开发变得简单。Spring Boot 采用了 java config 的方式,对 Spring 进行了配置,并且提供了大量的注解,极大的提供了工作的效率。
- 使配置变得简单。Spring Boot 提供许多默认配置,当然也提供自定义配置。但是所有的 Spring Boot 的项目都只有一个配置文件:application.properties/application.yml。用了 Spring Boot,再也不用担心配置出错找不到问题所在了。
- 使部署变得简单。Spring Boot 内置了三种 servlet 容器:tomcat、jetty、undertow。所以你只需要一个 java 的运行环境就可以跑 Spring Boot 的项目了。Spring Boot 的项目可以打成一个 jar 包,然后通过运行 java -jar xxx.jar 来运行。(Spring boot 项目的入口是一个 main 方法,运行该方法即可。)
- 使监控变得简单。Spring Boot 提供了 actuator 包,可以使用它来对你的应用进行监控。
- 插拔式搭建项目。boot 是个脚手架,如果需要 web 功能, maven 引入对应的 jar 包;需要集成 mybatis ,引入包,简单几句注解则组装完成。