Springboot 整合WebFlux 实现RESTFUI风格API 及简单的CRUD

简介: Springboot 整合WebFlux 实现RESTFUI风格API 及简单的CRUD

这里简单介绍下springboot整合webFlux(入门) ,使用netty通信。


首先是创建一个springboot项目,这里就不介绍怎么创建了。


接下来是导入依赖包:

 

      <!--webflux-->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-webflux</artifactId>
    </dependency>


(使用这个依赖包后,不要再导入spring-boot-starter-web包了,因为我们webflux使用的是netty)

 

然后是创建一个简单的pojo:

User.java


package com.test.webflux.pojo;
import lombok.Data;
/**
 * @Author:JCccc
 * @Description:
 * @Date: created in 16:08 2019/5/30
 */
@Data
public class User {
    /**
     * id
     */
    private Long id;
    /**
     * 姓名
     */
    private String name;
    /**
     * 描述
     */
    private String desc;
}


接下来是dao层(netty不支持mysql,所以想要对数据进行CRUD可以采取整合mongodb和redis),这里我暂且采用的ConcurrentMap来操作数据:


UserRepository.java


package com.test.webflux.dao;
import com.test.webflux.pojo.User;
import org.springframework.stereotype.Repository;
import java.util.Collection;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.atomic.AtomicLong;
/**
 * @Author:JCccc
 * @Description:
 * @Date: created in 16:30 2019/5/30
 */
@Repository
public class UserRepository {
    private ConcurrentMap<Long,User> repository = new ConcurrentHashMap<>();
    private static final AtomicLong idGenerator = new AtomicLong(0);
    public Long save(User user){
        Long id=idGenerator.incrementAndGet();
        user.setId(id);
        repository.put(id, user);
        return id;
    }
    public Collection<User> findAll() {
        return repository.values();
    }
    public User findUserById(Long id) {
        return repository.get(id);
    }
    public Long updateUser(User user) {
        repository.put(user.getId(), user);
        return user.getId();
    }
    public Long deleteUser(Long id) {
        repository.remove(id);
        return id;
    }
}


接下来是handler层,这里简单列举了对ConcurrentMap进行CRUD的几个方法,

UserHandler.java


package com.test.webflux.handler;
import com.test.webflux.dao.UserRepository;
import com.test.webflux.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
/**
 * @Author:JCccc
 * @Description:
 * @Date: created in 16:38 2019/5/30
 */
@Component
public class UserHandler {
    private final UserRepository userRepository;
    @Autowired
    public UserHandler(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
    public Mono<Long> save(User user) {
        return Mono.create(userMonoSink -> userMonoSink.success(userRepository.save(user)));
    }
    public Mono<User> findUserById(Long id) {
        return Mono.justOrEmpty(userRepository.findUserById(id));
    }
    public Flux<User> findAllUser() {
        return Flux.fromIterable(userRepository.findAll());
    }
    public Mono<Long> modifyUser(User user) {
        return Mono.create(userMonoSink -> userMonoSink.success(userRepository.updateUser(user)));
    }
    public Mono<Long> deleteUser(Long id) {
        return Mono.create(userMonoSink -> userMonoSink.success(userRepository.deleteUser(id)));
    }
}


最后,创建下controller层写几个API(这里采用restful风格):

UserWebFluxController.java


package com.test.webflux.controller;
import com.test.webflux.handler.UserHandler;
import com.test.webflux.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
/**
 * @Author:JCccc
 * @Description:
 * @Date: created in 16:44 2019/5/30
 */
@RestController
@RequestMapping(value = "/user")
public class UserWebFluxController {
    @Autowired
    private UserHandler userHandler;
    /**
     * 根据ID查询某个User
     * @param id
     * @return
     */
    @GetMapping(value = "/{id}")
    public Mono<User> findUserById(@PathVariable("id") Long id) {
        return userHandler.findUserById(id);
    }
    /**
     * 查找所有User
     * @return
     */
    @GetMapping()
    public Flux<User> findAllUser() {
        return userHandler.findAllUser();
    }
    /**
     * 插入User
     * @param user
     * @return
     */
    @PostMapping()
    public Mono<Long> saveUser(@RequestBody User user) {
        return userHandler.save(user);
    }
    /**
     * 修改User
     * @param user
     * @return
     */
    @PutMapping()
    public Mono<Long> modifyUser(@RequestBody User user) {
        return userHandler.modifyUser(user);
    }
    /**
     * 根据ID删除User
     * @param id
     * @return
     */
    @DeleteMapping(value = "/{id}")
    public Mono<Long> deleteUser(@PathVariable("id") Long id) {
        return userHandler.deleteUser(id);
    }
}


到此,简单的webflux入门整合已经完成了。


那么我们最后把项目跑起来,简单测试一下,


image.png


接下来使用postman调用下插入user接口 :


image.png再调一下查询接口:


image.png


OK,其余的接口也是一样调用,那么简单的介绍就此完毕了。


(PS:想了解更多的,可以去查下mono和flux的相关资料,可以往上翻下,controller里面用到了Mono)


Mono 和 Flux 适用于两个场景,即: 
 Mono:实现发布者,并返回 0 或 1 个元素,即单对象。 
 Flux:实现发布者,并返回 N 个元素,即 List 列表对象。 
 有人会问,这为啥不直接返回对象,比如返回 City/Long/List。 
 原因是,直接使用 Flux 和 Mono 是非阻塞写法,相当于回调方式。 
 利用函数式可以减少了回调,因此会看不到相关接口。这恰恰是 WebFlux 的好处:集合了非阻塞 + 异步 
相关文章
|
4月前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
78 4
|
4月前
|
Java API 数据库
如何使用Spring Boot构建RESTful API,以在线图书管理系统为例
【10月更文挑战第9天】本文介绍了如何使用Spring Boot构建RESTful API,以在线图书管理系统为例,从项目搭建、实体类定义、数据访问层创建、业务逻辑处理到RESTful API的实现,详细展示了每个步骤。通过Spring Boot的简洁配置和强大功能,开发者可以高效地开发出功能完备、易于维护的Web应用。
111 3
|
4月前
|
IDE Java API
基于Spring Boot REST API设计指南
【10月更文挑战第4天】 在现代的软件开发中,RESTful API已经成为了构建网络应用的标准之一。它通过HTTP协议提供了与资源交互的方式,使得不同的应用程序能够进行数据交互。Spring Boot作为一个功能强大的框架,它简化了配置和开发流程,成为了构建RESTful API的理想选择。本文将详细介绍如何在Spring Boot中设计和实现高质量的RESTful API,并提供一些最佳实践。
79 1
|
4月前
|
NoSQL Java MongoDB
Springboot WebFlux项目结合mongodb进行crud
这篇文章介绍了如何使用Spring Boot WebFlux框架结合MongoDB进行基本的CRUD(创建、读取、更新、删除)操作,包括项目设置、实体类和Repository的创建、控制器的实现以及配置文件的编写。
88 0
Springboot WebFlux项目结合mongodb进行crud
|
28天前
|
XML 监控 前端开发
Spring Boot中的WebFlux编程模型
Spring WebFlux 是 Spring Framework 5 引入的响应式编程模型,基于 Reactor 框架,支持非阻塞异步编程,适用于高并发和 I/O 密集型应用。本文介绍 WebFlux 的原理、优势及在 Spring Boot 中的应用,包括添加依赖、编写响应式控制器和服务层实现。WebFlux 提供高性能、快速响应和资源节省等优点,适合现代 Web 应用开发。
83 15
|
2月前
|
存储 安全 Java
Spring Boot 编写 API 的 10条最佳实践
本文总结了 10 个编写 Spring Boot API 的最佳实践,包括 RESTful API 设计原则、注解使用、依赖注入、异常处理、数据传输对象(DTO)建模、安全措施、版本控制、文档生成、测试策略以及监控和日志记录。每个实践都配有详细的编码示例和解释,帮助开发者像专业人士一样构建高质量的 API。
105 9
|
4月前
|
缓存 Java API
基于Spring Boot REST API设计指南
【10月更文挑战第11天】 在构建现代Web应用程序时,RESTful API已成为一种标准,使得不同的应用程序能够通过HTTP协议进行通信,实现资源的创建、读取、更新和删除等操作。Spring Boot作为一个功能强大的框架,能够轻松创建RESTful API。本文将详细介绍如何在Spring Boot中设计和实现高质量的RESTful API。
182 61
|
3月前
|
Java 测试技术 API
详解Swagger:Spring Boot中的API文档生成与测试工具
详解Swagger:Spring Boot中的API文档生成与测试工具
107 4
|
4月前
|
安全 Java API
基于Spring Boot REST API设计指南
【10月更文挑战第10天】 在现代Web应用开发中,RESTful API扮演着至关重要的角色。Spring Boot作为一个高效、便捷的Java开发框架,为构建RESTful API提供了强大的支持。本文将分享基于Spring Boot的REST API设计指南,涵盖从项目初始化到API文档配置的全过程。
98 0
|
25天前
|
JavaScript Java 测试技术
基于SpringBoot+Vue实现的留守儿童爱心网站设计与实现(计算机毕设项目实战+源码+文档)
博主是一位全网粉丝超过100万的CSDN特邀作者、博客专家,专注于Java、Python、PHP等技术领域。提供SpringBoot、Vue、HTML、Uniapp、PHP、Python、NodeJS、爬虫、数据可视化等技术服务,涵盖免费选题、功能设计、开题报告、论文辅导、答辩PPT等。系统采用SpringBoot后端框架和Vue前端框架,确保高效开发与良好用户体验。所有代码由博主亲自开发,并提供全程录音录屏讲解服务,保障学习效果。欢迎点赞、收藏、关注、评论,获取更多精品案例源码。
59 10

热门文章

最新文章