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