Spring Boot简单介绍

Spring Boot用于创建可运行的、独立的、生产级的基于Spring的应用程序。Spring Boot对Spring和第三方库持约定大于配置的观念,以便可以轻松上手。大多数Spring Boot应用程序只需要很少的配置。

Spring Boot可以通过使用java -jar或更传统的war包部署来启动Java应用程序

Spring Boot的目标是:

  • 为所有Spring开发提供从根本上更快且可广泛访问的体验。
  • 开箱即用。
  • 提供一系列大型项目通用的非功能特性(例如嵌入式服务器、安全性、指标、健康检查和外部化配置)。
  • 没有代码生成,也不需要XML配置。

我们使用Spring Boot的好处:

  • Spring Boot的组件自动装配,可以让开发人员专注于核心业务开发。
  • 他的外部化配置,可以让程序一次构建、按需调配,到处运行。
  • 嵌入式容器,无需部署即可独立运行
  • Spring Boot Starter简化了依赖、按需装配
  • Production-Ready :一站式运维、生态无缝结合,应用程序推送到生产环境时对其进行监视和管理

系统要求

Spring Boot 2.6.2需要Java 8,并且兼容Java 17(包括Java 17 ),还需要Spring Framework 5.3.14或更高版本,这里采用Spring Boot 2.6.2,它是目前最新的正式版。

Spring Boot为以下构建工具提供了显式构建支持:

  • Maven 3.5+
  • Gradle 6.8.x 6.9.x and 7.x

Servlet 容器

Spring Boot支持如下图所示的嵌入式Servlet容器:

【Spring Boot】Spring Boot 简单介绍以及基本使用(构建 RESTful Web 服务)_java


可以将Spring Boot应用程序部署到任何兼容Servlet 3.1+的容器。

基本结构

使用Spring Initializr来构建Spring Boot应用,也可以使用Maven构建Spring Boot项目

【Spring Boot】Spring Boot 简单介绍以及基本使用(构建 RESTful Web 服务)_java_02


选择依赖和Spring Boot版本,这里添加基本的web依赖,来写一些基础的web服务。

【Spring Boot】Spring Boot 简单介绍以及基本使用(构建 RESTful Web 服务)_spring_03


以下是生成的Spring Boot项目,大致结构如下所示

【Spring Boot】Spring Boot 简单介绍以及基本使用(构建 RESTful Web 服务)_spring boot_04

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.6.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.xt</groupId>
<artifactId>springboot</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot</name>
<description>springboot</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>
</dependency>
</dependencies>

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

</project>

我们可以查看maven的依赖文件

【Spring Boot】Spring Boot 简单介绍以及基本使用(构建 RESTful Web 服务)_spring boot_05


这是他的依赖图,可以自己在IDEA里面查看

【Spring Boot】Spring Boot 简单介绍以及基本使用(构建 RESTful Web 服务)_spring_06

启动类(SpringbootApplication)

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringbootApplication {

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

}

@SpringBootApplication是一个方便的注解,它添加了以下所有内容:

  • @Configuration:将类标记为应用程序上下文的bean定义的源。
  • @EnableAutoConfiguration:告诉Spring Boot开始根据类路径设置、其他bean和各种property设置添加bean。例如,如果spring-webmvc在类路径上,这个注解将该应用标记为一个web应用程序,并激活关键行为,比如设置一个DispatcherServlet。
  • @ComponentScan:告诉Spring在com.xt包中寻找其他组件、配置和服务,让它找到控制器。

main()方法使用Spring Boot的SpringApplication.run()方法来启动应用程序。您注意到没有一行XML吗?也没有web.xml文件。这个web应用程序是100%纯Java的,你不需要配置任何基础设置。

点击run运行spring boot,启动成功,如下图所示:

【Spring Boot】Spring Boot 简单介绍以及基本使用(构建 RESTful Web 服务)_java_07

默认情况下,会显示INFO日志消息,包括一些相关的启动细节,比如启动应用程序的用户。如果您需要设置除INFO之外的日志级别,请参见日志级别进行设置。应用程序版本是使用来自主应用程序类包的实现版本来确定的。

web服务运行在Tomcat容器中,DispatcherServlet是一种Servlet实现,可以用于将请求派发给指定的控制器中定义的接口

基本使用(构建 RESTful Web 服务)

只需要编写如下两个文件

【Spring Boot】Spring Boot 简单介绍以及基本使用(构建 RESTful Web 服务)_spring boot_08

创建资源表示类(Greeting类)

我们创建一个entity文件夹来存放实体类。

写入如下Greeting类:

public class Greeting {

private final long id;
private final String content;

public Greeting(long id, String content) {
this.id = id;
this.content = content;
}

public long getId() {
return id;
}

public String getContent() {
return content;
}
}

spring boot应用程序使用Jackson JSON库将类型为Greeting的实例自动封装为JSON。Jackson由web starter默认包括。

创建资源控制器(GreetingController类)

创建controller文件夹,存放控制器

在Spring构建RESTful web服务的方法中,HTTP请求由控制器处理。这些组件由@RestController注解标识。

GreetingController如下所示,通过返回greeting类的一个新实例来处理/greeting的GET请求:

package com.xt.springboot.controller;

import com.xt.springboot.entity.Greeting;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.atomic.AtomicLong;

/**
* @Author: codingXT
* @Date: 2022-01-20-19:19
* @Description:
*/
@RestController
public class GreetingController {

private static final String template = "Hello, %s!";
private final AtomicLong counter = new AtomicLong();

@GetMapping("/greeting")
public Greeting greeting(@RequestParam(value = "name", defaultValue = "World") String name) {
return new Greeting(counter.incrementAndGet(), String.format(template, name));
}
}

@GetMapping注解确保到/greeting的HTTP GET请求映射到greeting()方法。

对于其他HTTP动词也有相应的注解(例如对于POST的@PostMapping)。还有一个@RequestMapping注解,它们都是从它派生的,可以作为同义词(例如@RequestMapping(method=GET)等同于@GetMapping)。

@RequestParam将查询字符串参数name的值绑定到greeting()方法的name参数中。如果请求中没有name参数,则使用defaultValue,这里是World。

传统MVC控制器和前面展示的RESTful web服务控制器之间的一个关键区别是创建HTTP响应体的方式。这个RESTful web服务控制器填充并返回一个greeting对象, 对象数据将作为JSON直接写入HTTP响应。而不是依靠视图view技术将greeting数据在服务器端呈现为HTML。

这段代码使用了Spring @RestController注解,它将类标记为一个控制器,其中每个方法返回一个domain对象,而不是一个视图view。它包含@Controller(带有此注解的类型被视为控制器)和@ResponseBody(指示方法的返回值应绑定到Web响应的Body中)两个注解。

Greeting对象必须转换为JSON。由于Spring的HTTP消息转换器支持,您不需要手动执行此转换。因为Jackson2在类路径上,Spring的MappingJackson2HttpMessageConverter被自动选择来将Greeting实例转换为JSON。

测试运行

在浏览器输入

http://localhost:8080/greeting

【Spring Boot】Spring Boot 简单介绍以及基本使用(构建 RESTful Web 服务)_应用程序_09

通过访问http://localhost:8080/greeting?name=xt 提供名称查询字符串参数。

http://localhost:8080/greeting?name=xt

【Spring Boot】Spring Boot 简单介绍以及基本使用(构建 RESTful Web 服务)_应用程序_10

注意id属性是如何从1更改为2的(浏览器每请求一次,增加一次)。这证明您正在跨多个请求对同一个GreetingController实例进行操作,并且它的counter字段按照预期在每个调用中递增。

References:

(写博客主要是对自己学习的归纳整理,资料大部分来源于书籍、网络资料和自己的实践,整理不易,但是难免有不足之处,如有错误,请大家评论区批评指正。同时感谢广大博主和广大作者辛苦整理出来的资源和分享的知识。)