简述

学习过 Spring 的开发者可能都听说过 Spring 配置地狱,其实这是随着 Spring 的不断发展,从原本一个单一简洁的小框架逐渐变成了一个大而全的开源软件,Spring 的边界不断的进行了扩充,几乎现在市面上主流的开源软件甚至商用软件都有 Spring 对应的组件支持。

Spring 每集成一个开源软件,就需要增加或扩展一些基础配置,随着软件项目越来越庞大,使用 Spirng 开发企业应用就需要引入更多配置文件,配置的增加让开发者对配置理解困难的同时也更容易配置出错,后来人们就称类问题为 Spring 配置地狱。

Spring 团队 Pivotal 充分意识到了这些问题,急需有一套软件可以解决这些问题,此时恰逢微服务概念的兴起,快速开发微服务应用变的更为迫切,Spring 刚好处在这么一个交叉点上,2013年初 Spring Boot 项目进行立项研发,2014年4月发布了 Spring Boot 1.0.0 版本,2018年3月发布了 Spring Boot 2.0.0 版本。

Spring Boot 在受到开源社区的持续关注的同时,也让我们开发 Spring 应用变的更简单、轻量化,我们不必再像以往使用 Spring 开发应用那样的麻烦,需要构建项目、打包应用、部署到Web容器(Tomcat、WebSphere、WebLogic、JBoss、Resin)等应用服务中来运行我们的服务。通过 Spring Boot 开发的服务,只需要定义一个服务入口应用类,然后把服务打包成 Jar 包,就可以在安装了 Java 环境的机器上通过 java -jar applicationxxx.jar 运行起来,这一切相比起使用 Spring 框架开发的应用来说,已经变的非常的简单轻便了。

创建你的第一个项目

相信你也和我一样,迫不及待的想要体验 Spring Boot 了。下面将学习如何快速的创建你的第一个 Spring Boot 应用,并实现最简单的 HTTP 请求响应处理,通过该实例你将对 Spring Boot 有一个初步的掌握,并体验到 Spring Boot 的简洁、强大以及快速开发的特性。

使用 Spring Initializr 创建项目

Spring Boot 官方提供非常便捷的创建 Spring Boot 应用的在线工具 Spring Initializr ;下面我将带领大家使用创建我们的第一个项目。

Step 1. 浏览器中访问 Spring Initializr或者在浏览器中直接输入 https://start.spring.io
页面展示如下:
Spring Initializr.png

Spring Initializr 页面中各选项说明

  • Project:项目构建工具选择项,目前支持 Maven 和 Gradle。本教程使用和 Spring Boot 一致的项目构建工具 Maven。
  • Language:编程语言选择,目前支持Java、Kotlin和Groovy;本教程使用 Java 语言为主,在特定场景会接单介绍 Groovy 脚本的使用。
  • Spring Boot:Spring Boot版本选择,本教程将使用目前最新的2.2.4版本。
  • Project Metadata:项目元数据,其实就是 Maven 项目的基本元素,点开 Options 选项可以看到完整的元素,包括 Group、Artifact Id、Name、Description、Package name、Packaging、Java版本等。根据这些元素可以自己设置项目元数据属性。比如本文项目设置如下:

Project Metadata.jpg

  • Dependencies:选择创建项目需要依赖的 Spring Boot 组件。选择方式可以通过搜索或者列表可视化方式进行选择。本文将创建一个 Web 应用,因此使用列表方式选择Web应用组件,其他依赖组件将自动关联。如下图:

Dependencies.png

  • Generate:点击" Generate " 按钮或者使用" Ctrl+Enter "快捷键即可生成项目;此时浏览器会下在一个与填入 Argifact 同名的 chapter-simple-1.zip 压缩包,该压缩包就是 Spring Initializr 生成的 Spring Boot 应用项目 chapter-simple-1。
  • Explore:点击" Explore " 按钮或者使用" Ctrl+Space "快捷键即可浏览项目内容,具体项目结构和内容如下:

Explore.png

  • Share:点击" Share "按钮,系统会弹出如下图内容,可以选择" Copy "项拷贝 Spring Initializr 按照你设置好的参数项目连接,然后可以把该连接分享给团队。

Share.jpg

至此,项目配置和生成已完成。

Step 2.解压在Step 1步骤中生成的chapter-simple-1.zip压缩包,并把该压缩包文件解压后放到你的工作目录中。

Step 3.导入IDE。
Step 3.1以 Spring Tool Suite 4 为例。

  • 打开 Spring Tool Suite 4,依次选择 File –> Import –> Maven –> Existing Maven Projects 然后选择 下一步(Next)。
  • 在 Import Maven Projects 界面中的 Root Directory 目录选择项中通过 Browse.. 选择在 Step 2步骤中的工作目录(即 Select Root Folder 指向 chapter-simple-1 文件夹)然后选中 Select Folder 按钮。
  • 在 Import Maven Projects 界面中选择 下一步(Next) 后等待Spring Tool Suite 4 导入项目。
    注意:初次导入项目,由于 Maven 需要加载依赖项和重建 Maven 索引,需要一些时间,请耐心等待即可。

项目导入完成后,在编辑器中可以看到和Step 1Explore一样的目录结构,那么恭喜你项目创建成功。

使用 Spring Tool Suite 4 创建项目

Step 1. 在 Spring Tool Suite 4 菜单栏中依次选择 File –> New –> Other,弹出如下界面:

Create Project 00.jpg

  • 在弹出的界面中选择 Spring Boot –> Spring Starter Project 选项,完成后选择 下一步(Next)进入 New Spring Starter Project 界面如下图:

Create Project 01.jpg
界面中红框标注的选项和Spring Initializr 页面中Project Metadata 类同,差别在于使用 Spring Tool Suite 4 创建 Spring Boot 项目时需要选择本地工作目录(Location)和创建的项目版本(Version),在Spring Initializr 页面中创建项目时系统默认生成" 0.0.1-SNAPSHOT "版本。

  • 设置好元数据后选择下一步(Next)进入 New Spring Starter Project Dependencies 界面,如下图:

Create Project 02.jpg 在该界面中选择 Spring Boot Version 为2.2.4,在 Available 选项中选择 Web –> Spring Web,至此可以选择下一步(Next)或者完成(Finish),选择完成时系统开始创建项目,如果初次创建项目,Maven会下载项目所需依赖组件和构建项目索引,请耐心等待。

  • 如果选择下一步(Next)会进入如下界面:

Create Project 03.jpg
该界面中 Full Url 的值和Spring Initializr 页面中Share 中生成待拷贝值相同。

至此,就完成项目的创建工作了。

项目结构说明

项目结构如下图:

Project tree.jpg
Spring Boot 项目结构分三个文件如下:

  • src/main/java 项目代码存储目录
  • src/main/resources 项目资源文件(如静态样式、脚本文件、模板等)、配置文件存储目录
  • src/test/java 项目单元测试存储目录

项目中默认生成的 ChapterSimple1Application 和 ChapterSimple1ApplicationTests 类可以直接运行。

  • ChapterSimple1Application 类运行后,启动8080端口服务,可以在浏览器直接输入 http://localhost:8080/ 进行访问,访问后会出现 Whitelabel Error Page 提示,至此服务启动完成。
    运行方式:

Project Run.jpg
运行结果:

Project Run results.jpg

  • ChapterSimple1ApplicationTests 类使用 JUnit Test 运行后可通过日志观察运行状态。

以上完成了项目的创建和简单的运行,下面将对项目依赖和创建一个" Hello World! "应用以及单元测试进行介绍。

项目依赖说明

打开 pom.xml 文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.saiyueze</groupId>
    <artifactId>chapter-simple-1</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>chapter-simple-1</name>
    <description>Spring Boot simple learning</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

pom.xml 文件从上向下共5个部分:

  • parent 节点部分:该部分主要用于继承自 spring-boot-starter-parent 的依赖管理,版本控制等。
  • 项目/Maven元数据节点部分:该部分内容即为创建项目时填写的Project Metadata 内容,包括groupId、artifactId、version、name、description等。
  • 项目properties节点部分:该部分用于存储项目中公用的版本信息等
  • dependencies节点部分:项目具体依赖组件配置,创建项目时选择了 Spring Web 组件,因此文件中引入了 spring-boot-starter-web组件;同时 Spring Boot 项目创建时默认会引入 spring-boot-starter-test 单元测试组件。
  • build节点部分:项目构建配置,默认使用 spring-boot-maven-plugin 组件,在打包时该组件会配合spring-boot-starter-parent依赖把我们创建的Spring Boot 应用打包成我们设置的 jar 运行程序包。

编写一个简单应用

方式一:

  1. 直接在 ChapterSimple1Application.java 文件中添加如下代码:
    @RestController
    public class HelloController {
        @RequestMapping("/hello")
        public String index() {
            return "Hello World!";
        }
    }
  1. 右键选择ChapterSimple1Application.java 类 –> Run As –> Spring Boot App 启动服务,启动成功后服务监听 8080 端口,在浏览器直接输入 http://localhost:8080/hello 进行访问,访问后会出现 Hello world!,至此应用程序创建完成。

方式二:

  1. 新建名为com.saiyueze.chapter.simple1.webPackage
  2. com.saiyueze.chapter.simple1.web包中添加HelloController.java文件,内容如下:
    @RestController
    public class HelloController {
    
        @RequestMapping("/hello")
        public String index() {
            return "Hello World!";
        }
    
    }
  1. 按照方式一中 2 进行运行。

编写一个单元测试

打开 src/test/java 目录中 ChapterSimple1ApplicationTests.java 文件,编写如下代码:

    package com.saiyueze.chapter.simple1;
    
    import static org.hamcrest.CoreMatchers.equalTo;
    import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
    
    import org.junit.jupiter.api.BeforeEach;
    import org.junit.jupiter.api.Test;
    import org.junit.jupiter.api.extension.ExtendWith;
    import org.junit.runner.RunWith;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.http.MediaType;
    import org.springframework.test.context.junit.jupiter.SpringExtension;
    import org.springframework.test.context.junit4.SpringRunner;
    import org.springframework.test.web.servlet.MockMvc;
    import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
    import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
    import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
    import org.springframework.test.web.servlet.setup.MockMvcBuilders;
    
    import com.saiyueze.chapter.simple1.web.HelloController;
    
    //@RunWith(SpringRunner.class)
    @ExtendWith(SpringExtension.class)
    @SpringBootTest //提供spring依赖注入
    class ChapterSimple1ApplicationTests {
    
        private MockMvc MockMvc;
    
        @BeforeEach
        public void setUp() throws Exception {
            MockMvc = MockMvcBuilders.standaloneSetup(new HelloController()).build();
        }
    
        @Test
        public void getHello() throws Exception {
            MockMvc.perform(MockMvcRequestBuilders.get("/hello")
                    .accept(MediaType.APPLICATION_JSON))
            // 使用System.out输出Response值
            .andDo(MockMvcResultHandlers.print())
            //.andReturn();
            .andExpect(MockMvcResultMatchers.status().isOk())
            .andExpect(content().string(equalTo("Hello World!")));
        }
    }

编写完成后,右键 Run As –> Junit Test 即可看到运行结果,同时也可以在日志窗口中看到如下内容:

    MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [Content-Type:"application/json", Content-Length:"12"]
     Content type = application/json
             Body = Hello World!
    Forwarded URL = null
   Redirected URL = null
          Cookies = []

特别提示: 本文的单元测试代码使用 JUnit 5进行编写,和JUnit 4存在差异,因此阅读和调试时请注意。关于JUnit 5的差异,后续课程中会专题说明。

OK,到此已完成本课程的目标,请自行下载本节内容中的代码进行调试。

代码示例

本文实例代码对应下面代码仓库中的 chapter-simple-1 目录:
Github:https://github.com/Saiyueze/spring-boot-learning

总结

使用 Spring Boot 可以非常方便、快速的搭建应用项目,它极大的简化了框架依赖组件之间的版本兼容性,项目中需要使用任何组件时,仅仅添加相关配置即可而不用关心具体的版本。

参考:
https://docs.spring.io/spring-boot/docs/2.2.4.RELEASE/reference/html/getting-started.html#getting-started
https://blog.csdn.net/ityouknow/article/details/80682237