SpringBoot项目整合常用场景和开发工具
本篇文章主要整合一些 SpringBoot 项目常用的场景和开发工具,希望观众老爷们多多支持!
1. 起步:创建 SpringBoot 项目
1.1. 创建初始项目
- 选择新建项目->创建 Maven项目,选择JDK1.8->下一步

- 输入项目名称和组ID即可(工件名称通常是项目名称),点击完成即可

1.2. Maven 配置
在创建的项目中进行 Maven 配置。
- 添加父工程
    <parent>
        <artifactId>spring-boot-starter-parent</artifactId>
        <groupId>org.springframework.boot</groupId>
        <version>2.6.5</version> <!--指定SpringBoot的版本-->
    </parent>
- 添加依赖
<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
1.3. 创建启动类
在 java 文件夹下创建 com.yanghi.start 包,并在包下创建项目启动类SpringStartApplication,并在类上添加 @SpringBootApplication
package com.yanghi.start;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
 * SpringBoot 启动类
 * @author 泗安
 */
@SpringBootApplication
public class SpringStartApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringStartApplication.class, args);
    }
}
1.4. 创建控制层 Controller,处理请求
在 com.yanghi.start 包下,创建 Controller 包,并在包下创建 HelloController 类,进行请求处理。并添加方法进行请求处理。
package com.yanghi.start.controller;
/**
 * 处理请求
 * @author 泗安
 */
@Controller 
public class HelloController {
    
    @RequestMapping("/hello")
    @ResponseBody
    public String hello(){
        return "Hello SpringBoot";
    }
}
注意
- @Controller注解,用于将- Controller层类交给- Spring IOC容器进行管理。
- @RequestMapping注解 ,表示请求映射,可指定请求地址和请求的方式
- @ResponseBody注解,在- SpringBoot中,- Controller层代码,返回字符串的话,默认是进行页面的跳转(模板);通过该注解,可将返回值变为响应体,进行数据的返回。该注解也可标注在类上,那么该类中的所有请求方法都返回数据。
1.5. 启动项目,进行测试
由于 SpringBoot 内嵌了 Tomcat web server,启动我们创建的 SpringBoot 启动类即可

通过图片的红框处,我们可以指定 Tomcat 服务器的默认地址为 localhost:8080
我们打开浏览器访问 localhost:8080/hello 试试看

1.6. 项目打包部署
SpringBoot 项目,如何进行打包,并进行部署
- 添加 Maven打包插件
 <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
- 进行打包

- 打包完成后,就可以在左侧的 target输出文件中看到打包好的jar包了

- 打开命令行工具 cmd,输入java -jar项目jar包地址,即可运行项目

- 在服务器上,需要将 jar包上传到服务器,打开终端,安装Java环境,使用命令进行部署即可。
1.7. 快速构建 SpringBoot 项目
通过 idea 中创建项目的 Spring Initializr 进行快速创建
- 选择 Spring Initializr指定项目名称、组、工件、软件包名称、Java版本、打包方式

- 点击下一步,指定你需要添加的依赖,如 Web,SQL等

- 点击完成,即可创建初始化项目
2. 项目热部署
SpringBoot 为我们提供了一个方便我们开发测试的工具 dev-tools。使用后可以实现热部署的效果。当我们运行程序后对程序进行了修改,程序会自动重启部署。
原理是使用了两个 ClassLoader,一个 ClassLoader加载哪些不会改变的类(第三方jar包),另一个 ClassLoader加载会更改的类,称之为 Restart ClassLoader;这样在有代码更改的时候,原来的 Restart ClassLoader被丢弃,重新创建一个 Restart ClassLoader,由于需要加载的类相对较少,所以能够实现较快的重启时间。
2.1. 准备工作
- 设置 IDEA自动编译,在IDEA中的设置中进行配置,打开设置后,搜索输入compiler(编译器),打开勾选Bulid project automatically(自动构建项目),然后应用即可

- 设置允许程序运行时自动启动,在 IDEA中,快捷键crtl + shift + alt + /,在出现的弹窗中,点击Registry (注册表)。

然后在出现的窗口中勾选 compiler.automake.allow.when.app.running重启IDEA即可
注意
当你没有找到compiler.automake.allow.when.app.running时。可打开设置,通过高级设置(Advanced Settings)中的编译器(complier)中的选项勾选,然后重启项目即可。

2.2. 使用
首先在 pom.xml中添加以下依赖,重新编译项目即可。
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-devtools</artifactId>
  <optional>true</optional>
</dependency>
然后触发热部署,当我们在修改完代码或者静态资源后,即可自动进行热部署,也可以使用 crtl + F9 强制热部署。
3. 单元测试
我们可以使用 SpringBoot整合 Junit进行单元测试。从 SpringBoot 2.2.0 版本开始引入 JUnit 5作为单元测试默认库。
下面进行 SpringBoot 整合 JUnit进行单元测试。
3.1. 使用
- 添加依赖
<dependency>
	<groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-test</artifactId>
</dependency>

- 创建测试
在需要进行测试的类上,按住 Alt + Enter,在弹出的窗口中,点击创建测试,勾选需要测试的成员方法,点击确定。

然后就可以在 test/java包下生成对应的测试类了。我们需要在类上标注 @SpringBootTest注解,即可使用被 Spring容器所管理的全部bean对象了,也就是说我们可以使用 @AutoWired或者 @Resource注入 Bean进行使用了。
@SpringBootTest
class HelloControllerTest {
    @Autowired
    private HelloController helloController;
    @Test
    void hello() {
        helloController.hello();
    }
}
当我们需要进行测试的类,又添加了几个方法,而我们已经生成了测试类,那么我们可以重新使用 Alt+Enter,勾选未测试的成员方法,就可以在测试类中添加新增需要测试的方法。
3.2. 兼容老版本
当我们对老项目中的 SpringBoot进行了版本升级后会发现之前的单元测试代码出现了一些问题(注解或找不到,无法注入 Bean)。
因为 JUnit5和之前的 JUnit4有比较大的不同。

从上面可以看出 JUnit5由 Junit Platform、Junit Jupiter和 Junit Vintage组成。
- Junit Platform是- JUnit提供的平台功能模块,通过它,其他的测试引擎也可以接入。
- Junit Jupiter是- JUnit5的核心,是一个基于- JUnit Platform的引擎实现,它包含许多丰富的新特性来使得自动化测试更加方便和强大。
- Junit Vintage是兼容- JUnit3、- JUnit4版本的测试引擎,使得旧版本的自动化测试也可以在- JUnit5下正常运行。
虽然 JUnit5包含了 JUnit Vintage来兼容JUnit3、JUnit4,但是 SpringBoot 2.4以上版本对应的 spring-boot-starter-test移除了对 Vintage的依赖。所以相对于SpringBoot 2.4以上版本不兼容
JUnit3、JUnit4。
那么我们只需要在 pom.xml文件中引入 Vintage依赖,即可兼容使用JUnit3、JUnit4的老项目了。
<dependency>
	<groupId>org.junit.vintage</groupId>
	<artifactId>junit-vintage-engine</artifactId>
	<scope>test</scope>
</dependency>
注意
- 在 JUnit4的SpringBoot项目中,需要添加@SpringBootTest()和@RunWith(StringRunner.class)注解,才能使用Spring容器管理的Bean。
4. 整合 MyBatis
4.1. 数据准备
首先我们使用 MySQL创建一个数据库 tests。
create database tests;
use tests
然后创建一个表 user,添加字段 id、name、age、sex。
create table user (
	`id` int(11) not null auto_increment,
	`name` varchar(50),
  `age` int(11),
  `sex` char(1),
	 primary key (`id`)
)
然后插入几条数据
insert into user(`name`, `age`, `sex`) values ('lisi', 18, '男');
insert into user(`name`, `age`, `sex`) values ('wangwu', 20, '男');

4.2. 创建实体类
在 com.yanghi.start包下创建 bean包,存放我们的实体类;然后创建实体类 User,注意于 User表一一对应。
/**
 * User 实体类
 * @author yanghi
 */
public class User {
    
    private int id;
    
    private String name;
    
    private int age;
    
    private char sex;
    public User() {
    }
    public User(int id, String name, int age, char sex) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public char getSex() {
        return sex;
    }
    public void setSex(char sex) {
        this.sex = sex;
    }
    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        User user = (User) o;
        return id == user.id && age == user.age && sex == user.sex && Objects.equals(name, user.name);
    }
    @Override
    public int hashCode() {
        return Objects.hash(id, name, age, sex);
    }
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + ''' +
                ", age=" + age +
                ", sex=" + sex +
                '}';
    }
}
4.3. 整合 MyBatis
- 引入依赖
<!--引入mybatis-->
<dependency>
	<groupId>org.mybatis.spring.boot</groupId>
	<artifactId>mybatis-spring-boot-starter</artifactId>
	<version>2.2.2</version>
</dependency>
<!--引入mysql驱动-->
<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<scope>runtime</scope>
</dependency>
- 在 application.yml中配置数据库信息
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/tests?useSSL=false&serverTimezone=GMT&characterEncoding=UTF-8&allowPublicKeyRetrieval=true # 数据库url地址
    username: root # 用户名
    password: 123456 # 密码
    driver-class-name: com.mysql.cj.jdbc.Driver # 驱动
- 配置 mybatis 相关配置
mybatis:
  mapper-locations: classpath:mapper/*Mapper.xml # mapper映射文件路径
  type-aliases-package: com.yanghi.start.bean # 配置具体包下类具有默认别名,不需要写实体类的完整路径
然后在 resources 文件夹下,创建 mapper 文件夹,用于书写映射文件。

- 在 com.yanghi.start包下创建mapper包,并创建UserMapper接口
@Mapper
public interface UserMapper {
    /**
     * 获取User表的全部用户信息
     * @return 集合
     */
    List<User> getAllUsers();
}
- 在resource/mapper文件夹下,创建对应的UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.yanghi.start.mapper.UserMapper">
    <select id="getAllUsers" resultType="User">
        select id, name, age, sex from user
    </select>
</mapper
- 在 UserMapper接口上按住Alt + Enter生成测试即可
@SpringBootTest
class UserMapperTest {
    @Autowired
    private UserMapper userMapper;
    @Test
    void getAllUsers() {
        List<User> allUsers = userMapper.getAllUsers();
        System.out.println(allUsers);
    }
}

5. 整合Lombok工具
5.1. Lombok 的作用
Lombok是一个在 Java开发中用注解的方式,简化了 JavaBean 的编写(不需要手动添加无参/有参构造方法、getter/setter,equals,hasCode,toString),避免了冗余和样板式代码而出现的插件,让编写的类更加简洁,帮助我们更快的开发。
比如,我们在第三章整合 MyBatis时,User实体类的书写:我们必须添加固定的样板代码(getter/setter等)。
public class User {
    private int id;
    private String name;
    private int age;
    private char sex;
    public User() {
    }
    public User(int id, String name, int age, char sex) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public char getSex() {
        return sex;
    }
    public void setSex(char sex) {
        this.sex = sex;
    }
    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        User user = (User) o;
        return id == user.id && age == user.age && sex == user.sex && Objects.equals(name, user.name);
    }
    @Override
    public int hashCode() {
        return Objects.hash(id, name, age, sex);
    }
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + ''' +
                ", age=" + age +
                ", sex=" + sex +
                '}';
    }
}
而我们使用 lombok的注解,就只需写成员属性即可。lombok插件帮我们进行自动注入样板代码。
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private int id;
    private String name;
    private int age;
    private char sex;
}
5.2. 安装 Lombok
- 首先在· IDEA插件商品中搜索Lombok,进行安装。

- 在项目 pom.xml中添加lombok依赖
<dependency>
	<groupId>org.projectlombok</groupId>
	<artifactId>lombok</artifactId>
	<version>1.18.24</version>
</dependency>
5.3. Lombok 常用注解
- @Setter注解在类或字段上,注解在类时为所有字段生成- setter方法,注解在字段上时只为该字段生成- setter方法。
- @Getter使用方法同上,区别在于生成的是- getter方法。
- @ToString注解在类上,添加- toString方法。
- @EqualsAndHashCode注解在类上,生成- hashCode和- equals方法。
- @NoArgsConstructor注解在类上,生成无参的构造方法。
- @AllArgsConstructor注解在类上,生成包含类中所有字段的构造方法。
- @RequiredArgsConstructor注解在类上,为类中需要特殊处理的字段生成构造方法,比如- final和被- @NonNull注解的字段。
- @Data注解在类上,生成- setter/getter、equals、canEqual、hashCode、toString方法,如为- final属性,则不会为该属性生成- setter方法。
- @Slf4j注解在类上,生成- log变量,严格意义来说是常量。- private static final Logger log = LoggerFactory.getLogger(UserController.class);
总结
本篇文章只介绍一些简单的使用,具体的详解,请期待以后的文章,请观众老爷们批评指正和多多支持!
转载自:https://juejin.cn/post/7150674718763745293




