Spring Boot
构建第一个Spring Boot 项目
环境准备
- 安装
Java开发环境,默认下载Java 8,当然最好能安装多个Java版本,当然最好能配置一个可切换Java版本的开发环境。 - 配置
Maven,这里主要是配置Maven的国内镜像地址,可以使用国内阿里云的镜像,解决网络原因造成下载慢的问题。 - 安装
Idea,可以下载社区版本,有条件的可以安装正式版本,有学生邮箱可以申请一年的试用。
开始创建
- 打开
Idea,点击New Project,进行到IdeaNew Project界面。 - 选择构建工具
Maven或Gradle,这里使用Maven进行构建。 - 选择使用的开发语言
Java或Kotlin或Groovy,选择Java。 - 选择
Java版本,根据本地Java版本进行选择,这里选择Java 8。 - 修改项目名称,项目包名,完成项目创建。
对于 Java版本,Java 8 是项目中比较常用的版本,当然了已经2020年了,有条件的可以尝试下Java 12 或 Java 14 等高版本。
对于 Maven和Gradle,两者都是项目的构建工具,用来构建一个项目, 组织项目结构。 这里刚开始学习可以使用Maven 进行构建。目前Spring官方已经切换到Gradle进行构建。有条件的同学在学习完 Maven之后可以尝试使用 Gradle 进行构建项目。
项目结构
.
├── HELP.md
├── demo.iml
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src
├── main
│ ├── java
│ │ └── com
│ │ └── wisdom
│ │ ├── DemoApplication.java
│ │ └── ServletInitializer.java
│ └── resources
│ ├── application.properties
│ ├── static
│ └── templates
└── test
└── java
└── com
└── wisdom
└── DemoApplicationTests.java
其中 pom.xml 是 Maven 构建工具的配置文件,用来管理项目结构和项目依赖。
src/main/java 下的 DemoApplication 是程序的主入口文件,负责运行期整个项目。
src/main/resources 用来存放项目的资源文件和工程配置文件,其中 application.properties 是整个 Spring Boot 项目的配置文件。
src/test/ 用来存放测试模块代码,进行单元测试等测试工作。
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.3.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.wisdom</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>demo</name>
<description>Demo project for Spring Boot</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-tomcat</artifactId>
<scope>provided</scope>
</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>
以上是刚创建完后的Spring Boot 工程中的 pom.xml 文件。其中:
-
parent为我们引入了spring-boot-starter-parent,指定了整个项目spring boot的版本为2.3.3.RELEASE。 -
dependencies负责管理项目中的依赖项,这里Spring Boot 默认为我们引入了spring-boot-starter-web、spring-boot-starter-tomcat、spring-boot-starter-test等模块。 其中spring-boot-starter-web提供了web相应的支持。spring-boot-starter-tomcat为整个项目内置了一个tomcat,运行时无需再配置tomcat。
编写一个 Web 程序
引入web模块依赖
在 pom.xml 文件中引入 Web 模块的依赖。
在 pom.xml 的 dependencies 中添加以下依赖项。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
编写 HelloController
添加 package,命名为 com.wisdom.controller。
创建 HelloController 类,
package com.wisdom.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping
public String helloWorld() {
return "Hello Spring Boot";
}
}
启动主程序 DemoApplication,打开浏览器访问 http://localhost:8080/hello,可以看到浏览器中输出 Hello Spring Boot。
编写 RESTful API 接口
如果对于 RESTful API 不够了解,可以看一下廖雪峰写的关于RESTful API介绍: RESTful API 设计指南
创建实体类 User
package com.wisdom.domain;
public class User {
private Integer id;
private String name;
private Integer age;
public User(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
创建 UserController
在 Controller 中,我们使用 Collections.synchronizedList(new ArrayList<>()) 去保存我们的用户数据,完成用户的增删改查操作。
package com.wisdom.controller;
import com.wisdom.Result;
import com.wisdom.domain.User;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
@RestController
public class UserController {
static List<User> userList = Collections.synchronizedList(new ArrayList<>());
@GetMapping(value = "/{id}")
public Result<User> selectUserById(@PathVariable Integer id) {
Optional<User> userOptional = userList.stream().filter(user -> user.getId().equals(id)).findFirst();
if (userOptional.isPresent()) {
return new Result<>(200,"操作成功", userOptional.get());
} else {
return new Result<>(400, "查询失败");
}
// 以上业务代码可以简化为以下书写形式
return userList.stream()
.filter(user -> user.getId().equals(id))
.findFirst().map(user -> new Result<>(200, "操作成功", user))
.orElseGet(() -> new Result<>(400, "查询失败"));
}
@GetMapping()
public Result<List<User>> selectAllUser() {
return new Result<>(200, "操作成功", userList);
}
@PostMapping
public Result<User> saveUser(@RequestBody User user) {
if (!ObjectUtils.isEmpty(user)) {
userList.add(user);
return new Result<User>(200,"操作成功", user);
} else {
return new Result<>(400, "查询失败");
}
}
@PutMapping
public Result<User> updateUser(@RequestBody User saveUser) {
Optional<User> userOptional = userList
.stream().filter(user -> user.getId().equals(saveUser.getId()))
.findFirst();
if (userOptional.isPresent()) {
userOptional.get().setName(saveUser.getName());
userOptional.get().setAge(saveUser.getAge());
return new Result<>(200, "操作成功");
} else {
return new Result<>(400, "未查询到当前用户!");
}
}
@DeleteMapping(value = "/{id}")
public Result<User> deleteUser(@PathVariable Integer id) {
Optional<User> userOptional = userList.stream().filter(user -> user.getId().equals(id)).findFirst();
if (userOptional.isPresent()) {
userList.remove(userOptional.get());
return new Result<User>(200,"操作成功");
} else {
return new Result<>(400, "未查询到当前用户!");
}
}
}
Controller 中的一些注解
Spring Web 提供了基于注解的控制器配置,其中 @Controller 和 @RestController 注解用来处理请求映射,请求输入,处理异常等等。
@RestController
@RestController是一个组合注解,其本身使用@Controller和@ResponseBody。
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
@AliasFor(
annotation = Controller.class
)
String value() default "";
}
@RequestMapping
@RequestMapping注释用于请求映射到控制器的方法。指定请求地址、请求method类型、接口传参等。
@RequestMapping(method = RequestMethod.GET)
public String helloWorld() {
return "Hello Spring Boot";
}
@GetMapping@PostMapping@PutMapping@DeleteMapping@PatchMapping
@GetMapping 等注解是对RequestMapping的进一步封装。 以下两段代码等价。
@RequestMapping(method = RequestMethod.GET)
public String helloWorld() {
return "Hello Spring Boot";
}
GetMapping()
public String helloWorld() {
return "Hello Spring Boot";
}