Spring Boot 是工具集合
由繁琐的 xml 配置转为 yml
集成了多样化中间件 **-starter
Tomcat 变为内置
官方文档
https://docs.spring.io/spring-boot/docs/current/reference/html/index.html
翻译文档:
https://www.springcloud.cc/spring-boot.html

maven设置

设置镜像与使用 jdk1.8

  1. <mirrors>
  2. <mirror>
  3. <id>nexus-aliyun</id>
  4. <mirrorOf>central</mirrorOf>
  5. <name>Nexus aliyun</name>
  6. <url>http://maven.aliyun.com/nexus/content/groups/public</url>
  7. </mirror>
  8. </mirrors>
  9. <profiles>
  10. <profile>
  11. <id>jdk-1.8</id>
  12. <activation>
  13. <activeByDefault>true</activeByDefault>
  14. <jdk>1.8</jdk>
  15. </activation>
  16. <properties>
  17. <maven.compiler.source>1.8</maven.compiler.source>
  18. <maven.compiler.target>1.8</maven.compiler.target>
  19. <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
  20. </properties>
  21. </profile>
  22. </profiles>

不使用 IDEA 自带 maven,使用自己安装的 maven
image.png

创建 maven 项目,打开后选中 enable-auto import, maven 自动导入配置的依赖

真.Hello World

添加依赖

Spring Initializr 中的 pom.xml Spring Boot 依赖

先添加 parent

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

添加 web 依赖

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

编写主程序类

创建主程序文件
image.png
MainApplication :

/**
 * 主程序类
 * 这是一个 SpringBoot 应用
 */
@SpringBootApplication
public class MainApplication {

    public static void main(String[] args) {
        SpringApplication.run(MainApplication.class, args);
    }
}

编写 Controller

创建 HelloController 类
image.png

package com.qj.boot.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

    @RequestMapping("/hello")
    public String hello() {
        return "Hello World";
    }
}

@RestController:Controller 里面的方法都以 JSON 格式输出,不需要有其他额外的配置;如果改 @Controller 代表直接输出内容到页面。

@RequestMapping(“/hello”) :映射 “/hello” 请求到被注释的方法上处理

启动主程序

image.png
单击 运行 main 方法 就可以启动项目了。
最后两行输出以下内容表示运行成功

...
Tomcat started on port(s): 8080 (http) with context path '')

还可以通过另外两种方式启动:

  • 在项目路径下,使用命令行运行 mvn spring-boot:run 来启动,其效果与点击 run 一样
  • 将项目打包,打包以后以 Jar 包的形式启动
    • mvn clean package
    • java -jar target /hello-0.0.1-SNAPSHOT.jar

启动成功后打开 http://localhost:8080/hello 即可看见输出的内容

Hello World

其他配置

配置文件

官方文档
https://docs.spring.io/spring-boot/docs/current/reference/html/appendix-application-properties.html#common-application-properties

配置文件固定是 application.properties
image.png

创建可执行 jar 包(fat jar)

导入插件

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

默认为 jar 包
打包:maven 执行 clean;package
image.png
在 target 里可以找到 打包好的 jar 包
image.png
启动
→ java -jar helloword-1.0-SNAPSHOT.jar

URL传参

只要后端处理请求的方法中存在与参数相同名称的属性,请求过程中 Spring 会自动将参数值赋值到属性中。

@RestController
public class HelloController {

    @RequestMapping("/hello")
    public String hello(String name) {
        return "Hello World " + name;
    }
}

热部署

添加依赖:在 pom.xml 文件中添加

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-devtools</artifactId>
  <scope>runtime</scope>
  <optional>true</optional>
</dependency>

在 plugin 中配置 fork 为 true

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

IDEA:
Perference —> 勾选 Build project automatically
image.png
按 cmd + option + shift + / 选择 Registry
image.png
image.png
最后设置项目更新策略
image.png

单元测试

确保依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

IDEA 快速创建测试文件快捷键: cmd + shift + T
image.png

MockMVC 进行 Web 测试
MockMVC 内置了很多工具类和方法,可以模拟 post、get 请求,并且判断返回的结果是否正确等,也可以利用 print() 打印执行结果。

package com.ylq.demo.web;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
// print() 等 MockMvcResultHandlers 类的静态方法需要导入
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.*;

import static org.junit.jupiter.api.Assertions.*;

@SpringBootTest
class HelloControllerTest {

    private MockMvc mockMvc;

    @BeforeEach
    void setUp() {
        mockMvc = MockMvcBuilders.standaloneSetup(new HelloController()).build();
    }

    @Test
    void hello() throws Exception {
        mockMvc.perform(MockMvcRequestBuilders.post("/hello?name=ylq")
                .accept(MediaType.APPLICATION_JSON)).andDo(print());
    }
}

@SpringBootTest 系统会自动加载 Spring Boot 容器。
在日常测试中可以注入 Bean 来做一些局部业务测试。
@BeforeEach 表示在测试启动的时候优先执行,一般做资源初始化
使用 print() 方法会把具体过程打印出来

MockHttpServletRequest:
      HTTP Method = POST
      Request URI = /hello
       Parameters = {name=[ylq]}
          Headers = [Accept:"application/json"]
             Body = <no character encoding set>
    Session Attrs = {}
。。。
MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = [Content-Type:"application/json;charset=ISO-8859-1", Content-Length:"16"]
     Content type = application/json;charset=ISO-8859-1
             Body = Hello World ylq
    Forwarded URL = null
   Redirected URL = null
          Cookies = []

从 Response 的 Body 中可以看出请求成功

除了 print() 还有 判断返回值方法

@Test
    void hello() throws Exception {
        mockMvc.perform(MockMvcRequestBuilders.post("/hello?name=ylq")
                .accept(MediaType.APPLICATION_JSON))/*.andDo(print()*/
                .andExpect(MockMvcResultMatchers.content().string(Matchers.containsString("Hello")));
    }

如果执行成功说明测试没有问题,如果错误会抛异常