Spring Boot、Spring MVC 和 Spring 有什么区别?

2,164 阅读11分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

按照一贯的作风,我们首先还是先来介绍一下 SpringSpring BootSpring MVC。了解一下他们都是做什么的,解决了什么问题,我们才能清楚的理解他们之间的区别和联系。

先上结论!!!

解释过程在下面。

结论

Spring 是一个框架,Spring MVC 是 Spring 的一个模块,一个 web 框架,Spring Boot则是一个 Spring 的快速开发整合包。

概念

  1. 应用程序:是能完成我们所需要的功能的成品,比如购物网站、OA系统。

  2. 框架:是能完成一定功能的半成品。比如我们可以使用框架进行购物网站开发,框架做一部分功能,我们做一部分功能,这样应用程序就创建出来了。而且框架规定了你在开发应用程序时的整体结构,提供了一些基础功能,还规定了类和对象的如何创建、如何协作等。从而简化我们开发,让我们专注于业务逻辑开发。

  3. 非侵入式设计:从框架角度可以这样理解,无需继承框架提供的类,这种设计就可以看作是非侵入式设计,如果继承了这些框架类,就是侵入设计,如果以后想更换框架,之前写过的代码几乎无法重用,如果是非侵入式设计,则之前写过的代码仍然可以继续使用。

  4. 轻量级和重量级:轻量级是相对于重量级而言的,轻量级一般就是非侵入性、所依赖的东西非常少、资源占用非常少、部署简单等等,其实就是比较容易使用,而重量级正好相反。

  5. POJO:POJO(Plain Old Java Objects)简单的 Java 对象。POJO的内在含义是指那些没有从任何类继承、也没有实现任何接口,更没有被其他框架侵入的 Java 对象。POJO 有无参构造函数,每个字段都有 getter 和 setter 的 Java 类。

  6. 容器:在日常生活中容器就是一种盛放东西的器具,从程序设计角度看就是装对象的对象,因为存在放入、拿出等操作,所以容器还要管理对象的生命周期。

  7. 控制反转:IoC(Inversion of Control),控制反转还有另外一个名字叫做依赖注入(Dependency Injection)。就是以前程序控制对象,现在由框架控制。

  8. 脚手架:建筑上的脚手架就是先搭个架子,然后工人们慢慢往里面砌砖头,直到建筑成型。编程中的脚手架可以理解为有个空架子把环境配置、各种依赖都搭建好,要创建新项目的时候拿来直接往里面添加新项目需要的东西。

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 会在调用选定的 ControllerHandlerRequest 方法,并且在这个方法前后调用这个 Controller1interceptor(假如有配置的话),然后返回一个视图和模型的集合 ModelAndView。框架通过 ViewResolver 来解析视图并且返回一个 View 对象,最后调用 Viewrender 方法返回到客户端

特性(优势)

  1. 让我们能非常简单的设计出干净的 Web 层和薄薄的 Web 层。

  2. 进行更简洁的 Web 层的开发。

  3. 天生与 Spring 框架集成(如 IoC 容器、AOP 等)。

  4. 提供了强大的约定大于配置的契约式编程支持。

  5. 能简单的进行 Web 层的单元测试。

  6. 支持灵活的 URL 到页面控制器的映射。

  7. 非常容易与其他视图技术集成,如 Velocity、FreeMarker等等,因为模型数据不放在特定的 API 里,而是放在一个 Model 里(Map 数据结构实现,因此很容易被其他框架使用)。

  8. 非常灵活的数据验证,格式化和数据绑定机制,能使用任何对象进行数据绑定,不必实现特定框架的 API。

  9. 提供一套强大的 JSP 标签库,简化 JSP 开发。

  10. 更加简单的异常处理。

  11. 对静态资源的支持。

  12. 支持 Restful 风格。

Spring Boot

什么是 Spring Boot

Boot 是启动的意思。

Spring Boot 并不是一个全新的框架,它不是 Spring 解决方案的一个替代品,而是 Spring 的一个封装。

什么是 starter

Starter 可以总结为一种对依赖的合成。

在没有 starter之前,加入我想要在 Spring 中使用 jpa,那我可能需要做以下操作:

  1. 在 Maven 中引入使用的数据库的依赖(即 JDBC 的 jar)

  2. 引入 jpa 的依赖

  3. 在 xxx.xml 中配置一些属性信息

  4. 反复的调试直到可以正常运行

需要注意的是,上述操作在我们每次新建一个需要用到 jpa 的项目的时候都需要重复的做一次

但是这样操作就会带来很多问题:

  1. 如果过程比较繁琐,这样一步步操作会增加出错的可能性

  2. 不停地 copy&paste,不符合 Don't repert yourself 精神

  3. 在第一次配置的时候(尤其如果开发者比较小白),需要花费掉大量的时间

starter 主要目的就是为了解决上述问题。

starter 的理念是 starter 会把所有用到的依赖都给包含进来,避免了开发者自己去引入依赖所带来的麻烦。

为什么用 boot?

免费开源。中小型企业,没有成本研究自己的框架,boot 功能全也能快速搭建项目,降低开发成本。

其他语言的简易化,给 java 造成的冲击,再不改善,就会被抛弃了,催生了这款脚手架的诞生。

优点

  1. 使业务开发变得简单。Spring Boot 采用了 java config 的方式,对 Spring 进行了配置,并且提供了大量的注解,极大的提供了工作的效率。

  2. 使配置变得简单。Spring Boot 提供许多默认配置,当然也提供自定义配置。但是所有的 Spring Boot 的项目都只有一个配置文件:application.properties/application.yml。用了 Spring Boot,再也不用担心配置出错找不到问题所在了。

  3. 使部署变得简单。Spring Boot 内置了三种 servlet 容器:tomcat、jetty、undertow。所以你只需要一个 java 的运行环境就可以跑 Spring Boot 的项目了。Spring Boot 的项目可以打成一个 jar 包,然后通过运行 java -jar xxx.jar 来运行。(Spring boot 项目的入口是一个 main 方法,运行该方法即可。)

  4. 使监控变得简单。Spring Boot 提供了 actuator 包,可以使用它来对你的应用进行监控。

  5. 插拔式搭建项目。boot 是个脚手架,如果需要 web 功能, maven 引入对应的 jar 包;需要集成 mybatis ,引入包,简单几句注解则组装完成。

参考文档