WebFlux响应式编程基础工程搭建

最近接到公司升级 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的深入使用及高级特性。由于笔者水平有限,也许会有一些讲解不清楚或者错误的地方,欢迎大家前来交流、指正

相关推荐
用户47949283569158 分钟前
我只是给Typescript提个 typo PR,为什么还要签协议?
前端·后端·开源
Surpass余sheng军15 分钟前
AI 时代下的网关技术选型
人工智能·经验分享·分布式·后端·学习·架构
JosieBook17 分钟前
【Spring Boot】Spring Boot调用 WebService 接口的两种方式:动态调用 vs 静态调用 亲测有效
java·spring boot·后端
a程序小傲20 分钟前
京东Java面试被问:Spring拦截器和过滤器区别
java·面试·京东云·java八股文
喵个咪1 小时前
开箱即用的 GoWind Admin|风行,企业级前后端一体中后台框架:基于 GORM 从零实现新服务
后端·go·orm
2401_871260021 小时前
Java学习笔记(二)面向对象
java·python·学习
是梦终空2 小时前
计算机毕业设计252—基于Java+Springboot+vue3+协同过滤推荐算法的农产品销售系统(源代码+数据库+2万字论文)
java·spring boot·vue·毕业设计·源代码·协同过滤算法·农产品销售系统
丿BAIKAL巛2 小时前
Java前后端传参与接收全解析
java·开发语言
cc蒲公英2 小时前
javascript有哪些内置对象
java·前端·javascript
guslegend2 小时前
Spring AOP高级应用与源码剖析
java