初学 Spring Boot,你需要了解的 7 样东西

5,082 阅读7分钟

本文翻译自 7 Things to Know Getting Started With Spring Boot by Ranga Karanam

Spring Boot 是一个比较 tricky 的框架,所以也往往不容易理解。这篇教程将讲解 Spring Boot 的基本组成,包括 Starter 项目、自动配置和 Starter Parents 等,来帮助初学者能更好的理解和掌握 Spring Boot。

理解 Spring Boot 的架构

Spring Boot 包含了这些组成部分:

  1. Spring Boot Starter 项目
  2. Spring Boot Starter Parent
  3. 自动配置

首先我们会先把 Spring Boot 跟 Spring、Spring MVC 做一个比较,来帮助理解 Spring Boot 到底带来了什么。一旦明白了 Spring Boot 能提供什么功能,也就能更好的使用 Spring Boot。

Spring Boot vs Spring MVC vs Spring

它们之间的关系,最重要的一点是:

Spring Boot 跟 Spring、Spring MVC 不是竞争关系,Spring Boot 是为了能更好的使用他们。

Spring 框架

Spring 框架最重要的特性就是依赖注入(Dependency Injection),而所有 Spring 模块的核心就是依赖注入和控制反转(IOC - Inversion of Control)。

通过妥善的使用依赖注入和控制反转,我们可以较为容易地开发出松散耦合的应用,并且易于测试。

Spring MVC

Spring MVC 提供了诸如 Dispatcher Servlet、ModelAndView 和 View Resolver 等,让编写松散耦合的 Web 应用变得很容易。

Spring Boot

Spring、Spring MVC 的一个弊端就是配置很复杂:

<bean
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix">
        <value>/WEB-INF/views/</value>
    </property>
    <property name="suffix">
        <value>.jsp</value>
    </property>
</bean>
<mvc:resources mapping="/webjars/**" location="/webjars/"/>

而 Spring Boot 通过自动配置Starter Project 解决了这个问题。同时它也提供了很多特性,让构建 production-ready 的应用变得容易和迅速。

关于 Spring Boot 和 Spring、Spring MVC 更深层次的对比,请阅读:Spring Boot vs. Spring MVC vs. Spring - How do they compare?

Spring Boot 自动配置

Spring 和 Spring MVC 有非常多的 XMl 和 Java Bean 配置。 而 Spring Boot 通过一个新思路为我们解决了这个问题:

我们能不能让配置变得更智能?当应用里面增加了 Spring MVC 的 JAR 包,我们能不能自动地配置一些 Java Bean?

  • 如果 classpath 里面有 Hibernate 的 JAR 包,Data Source 就自动配置好了,怎么样?
  • 如果 classpath 里面有 Spring MAC 的 JAR 包,Dispatcher Servlet 就自动配置好了,怎么样?

Spring Boot 自动配置的规则:

Spring Boot 首先会检查这两部分:一是 classpath 里面存在的框架;二是应用已经存在的配置。结合这两部分,Spring Boot 就可以提供这些框架所需的基本配置,这就是 Spring Boot 的自动配置。

关于自动配置的深层讲解,请阅读:What is Spring Boot Auto Configuration?

Spring Boot Starter 项目

Spring Boot 文档里是这样描述 Starter 项目的:

Starter 项目是一系列方便的依赖描述,可以在我们的项目中引用。通过 starter 项目,我们能“一站式”得获得所有所需的 Spring 以及相关技术,而不用像以前一样去找各种事例代码,复制相关的依赖描述。例如:如果我们想使用 Spring 和 JPA 来链接数据库,我们只需要把 spring-boot-starter-data-jpa 引入到我们的项目中,项目就搭建完了。

下面通过 Spring Boot Starter Web 来举个例子:

如果我们想开发一个 Web 应用或者 RESTful 服务,我们就可以直接使用 Spring Boot Starter Web。

当把 Spring Boot Starter Web 加到我们的项目依赖中,我们就可以看到相关的很多其他依赖也被加到应用里面了,如截图:

这里面包含了很多开发一个 Web 应用所需的常用模块。通过 Spring Boot Starter Web,我们可以很容易的引入并使用它们:

  • Spring - core,beans,context,AOP
  • Web MVC - Spring MVC
  • Jackson - JSON 解析库
  • Validation - Hibernate Validator,Validation API
  • Embedded Servlet Container - Tomcat
  • Logging - logback,slf4j

几乎所有的 Web 应用都需要这些模块,Spring Boot Starter Web 已经打包好了这些依赖。而开发者就不需要去处理这些依赖,以及它们的版本兼容问题。

Spring Boot 提供了大量这类 starter 项目。而 Spring Initializr 也全都支持,其中就包括:

  • spring-boot-starter-web-services:构建 SOAP Web 服务应用
  • spring-boot-starter-web:构建 Web 应用和 RESTful 服务
  • spring-boot-starter-test:编写单元测试和集成测试
  • spring-boot-starter-jdbc:传统的 JDBC 应用
  • spring-boot-starter-hateoas:给应用增加 HATEOAS 特性让服务更 RESTful 化
  • spring-boot-starter-security:使用 Spring Security 来进行认证和授权
  • spring-boot-starter-data-jpa:Spring Data JPA 和 Hibernate
  • spring-boot-starter-cache:让 Spring 框架支持缓存
  • spring-boot-starter-data-rest:使用 Spring Data REST 来暴露一个简单的 REST 服务

想更深入的了解 starter 项目,请阅读:Initializing Projects with Spring Boot Starters - Web and JPA

Spring Boot Starter Parent

几乎所有 Spring Boot 项目的 pom.xml 配置中,都使用了 spring-boot-starter-parent 来作为 parent 配置:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.0.RELEASE</version>
</parent>

parent POMs 让我们更好的管理多个子项目或者模块:

  • 配置相关:Java 版本和其他属性
  • 依赖管理:依赖的版本
  • 默认插件的配置

想更深入的了解 Spring Boot Starter Parent,请阅读:Introduction to Spring Boot Starter Parent

Spring Initializr:让创建 Spring Boot 项目像开 F1 赛车一样快

Spring Initializr 是一个非常好的初始化 Spring Boot 项目的工具。

它提供了一个很简单的 UI,通过它我们可以创建各种不同类型的 Spring 项目,如:

  • Web 应用
  • RESTful 服务
  • Batch 应用

我们来体验一下怎么通过 Spring Initializr 来创建一个项目:

如上图所示,只需简单几步:

  • 打开 Spring Initializr (start.spring.io/)
    • Group 输入 com.in28minutes.springboot
    • Artifact 输入 student-services
    • dependency 选择 Web
  • 点击页面下方的 Generate Project 按钮
  • 把项目导入到 intelliJ 或者 Eclipse 即可。

想更深入的了解 Spring Initializr,请阅读:Spring Initializr - Bootstrap Your Spring Boot Applications at F1 speed!

Spring Boot 和内嵌服务器

当我们创建了一个可部署的包之后,我们可以在部署包中嵌入一个服务器(如 Tomcat)。

例如,对于一个 Spring Boot 应用,我们可以构建一个 JAR 包,里面包含了一个内嵌的 Tomcat 服务器(Embedded Tomcat),然后我们就可以像执行一个普通的 Java 程序一样启动这个服务器。

一个内嵌的服务器意味着,在我们的部署包里面包含了服务器的二进制文件(如 tomcat.jar)

我们来看下 spring-boot-starter-web 的依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <version>2.0.0.M6</version>
    <scope>compile</scope>
</dependency>

可以看到,默认情况下,Starter Web 已经包含了 Starter Tomcat 的依赖:

  • Tomcat 是 Spring Boot 的默认内嵌服务器
  • Spring Boot 也支持 Jetty 和 Undertow

想更深入的了解内嵌服务器,请阅读:Spring Boot and Embedded Servers - Tomcat, Jetty, and Undertow

Spring Data

官方说明 projects.spring.io/spring-data…

Spring Data 提供了一个简单、统一,且基于 Spring 编程模型的数据接入层,同时还能保留了底层数据存储的一些特性。它让我们使用数据接入技术、关系型数据库、非关系型数据库、map-reduce 框架以及基于云的服务变得简单。

简单来说,Spring Data 提供了一个统一的抽象,我们可以不管底层多样的数据源,而使用一个统一的接入层。

Spring Data 包括了如下子模块:

  • Spring Data JPA - 关系型数据库
  • Spring Data MongoDB
  • Spring Data REST - 封装 Spring Data 仓库,提供一个优秀的 REST api 服务

想更深入的了解 Spring Data,请阅读:Introduction to Spring Data - Spring Data JPA, Spring Data REST, and MongoDB

其他引用