构建第一个Spring Boot 项目

1,056 阅读4分钟

Spring Boot

构建第一个Spring Boot 项目

环境准备

  • 安装Java 开发环境,默认下载Java 8,当然最好能安装多个Java版本,当然最好能配置一个可切换Java版本的开发环境。
  • 配置Maven,这里主要是配置Maven的国内镜像地址,可以使用国内阿里云的镜像,解决网络原因造成下载慢的问题。
  • 安装Idea,可以下载社区版本,有条件的可以安装正式版本,有学生邮箱可以申请一年的试用。

开始创建

  • 打开Idea,点击 New Project,进行到Idea New Project 界面。
  • 选择构建工具 MavenGradle ,这里使用Maven进行构建。
  • 选择使用的开发语言 JavaKotlinGroovy,选择 Java
  • 选择Java版本,根据本地Java版本进行选择,这里选择Java 8
  • 修改项目名称,项目包名,完成项目创建。

对于 Java版本,Java 8 是项目中比较常用的版本,当然了已经2020年了,有条件的可以尝试下Java 12Java 14 等高版本。 对于 MavenGradle,两者都是项目的构建工具,用来构建一个项目, 组织项目结构。 这里刚开始学习可以使用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.xmlMaven 构建工具的配置文件,用来管理项目结构和项目依赖。

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-webspring-boot-starter-tomcatspring-boot-starter-test 等模块。 其中 spring-boot-starter-web 提供了web相应的支持spring-boot-starter-tomcat 为整个项目内置了一个tomcat,运行时无需再配置tomcat

编写一个 Web 程序

引入web模块依赖

pom.xml 文件中引入 Web 模块的依赖。

pom.xmldependencies 中添加以下依赖项。

<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";
}