最近接到公司升级 jdk21&响应式编程的需求,研究了几天,带大家简单使用一下吧,由于多数公司使用的还是 jdk1.8,这篇文章我们就用 jdk1.8 来展示
一、为什么要使用响应式编程?
官方给了很多理由,总结有几个优点是异步处理,更多好用的API,这些API我觉得类似Stream的流式处理,我更想讲的是一些缺点,比如封装十分严重,有问题很难定位,和mybatis的兼容性差,但对性能的提升也是十分有效的,技术改造可以考虑一下
二、使用步骤
到使用这步默认大家已经研究过了响应式编程,并且熟悉优缺点,所以下面不再赘述这块
- 导入依赖
- 填写配置
- 编写dao、service、测试类等
2.0 文件夹展示

2.1 导入pom 依赖
java
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.18</version>
<relativePath/>
</parent>
<properties>
<java.version>8</java.version>
</properties>
<dependencies>
<!-- Spring WebFlux 核心依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<!-- R2DBC 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-r2dbc</artifactId>
</dependency>
<!-- R2DBC MySQL驱动 -->
<dependency>
<groupId>dev.miku</groupId>
<artifactId>r2dbc-mysql</artifactId>
<version>0.8.2.RELEASE</version> <!-- 兼容JDK 1.8的版本 -->
</dependency>
<!-- Redis 响应式依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</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>
2.2 填写配置文件
这是本地的一个测试数据库 school,下面贴出citizen的表数据
yaml
spring:
r2dbc:
url: r2dbc:mysql://localhost:3306/school?charset=UTF-8&serverTimezone=Asia/Shanghai
username: root
password: root
表结构
sql
CREATE TABLE `citizen` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL COMMENT '姓名',
`age` int(3) DEFAULT '1' COMMENT '年龄',
`address` varchar(50) DEFAULT NULL COMMENT '地址',
`birthday` datetime DEFAULT NULL COMMENT '出生年日',
PRIMARY KEY (`id`),
KEY `index_name_age_address` (`name`,`age`,`address`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='居民表'

2.3 编写CRUD
dao层继承了R2dbcReposiroty<Citizen, Integer>, Citizen是你的实体类,Integer是id的数据类型
正是由于继承了R2dbcRepository,和mybatis的兼容才难办,难办?那就别办了,要么全部改造,要么用旧的

Test类
service层只是简单的引用,没什么好讲的,直接给Test吧
typescript
@SpringBootTest
public class CitizenTest {
@Autowired
private CitizenService citizenService;
@Test
public void test01() {
System.out.println("hello world");
}
@Test
public void test02() {
Mono<Citizen> citizen = citizenService.getCitizenById(1);
System.out.println(citizen.block());
}
@Test
public void test03() {
Flux<Citizen> citizens = citizenService.getCitizenByName("程傲雪");
citizens.subscribe(
System.out::println
);
System.out.println(citizens.collectList().block());
}
@Test
public void test04() {
Citizen param = new Citizen();
param.setName("程傲雪");
param.setAge(23);
Flux<Citizen> citizens = citizenService.getByCitizen(param);
System.out.println(citizens.collectList().block());
}
}
运行结果跟大家正常写CRUD是一样的
三、总结
这篇这是webflux的入门,甚至还不全面,篇幅有限没把Redis带入进来,后面将会讲解WebFlux&Redis,已经Flux的深入使用及高级特性。由于笔者水平有限,也许会有一些讲解不清楚或者错误的地方,欢迎大家前来交流、指正