Spring web-flux 响应式编程
1、基于传统的结构 Demo (仅仅作为快速了解,生产环境不会用这种)
请求处理类 Controller 类
package com.yootk.webflux.handler;
import org.springframework.web.reactive.function.server.ServerRequest;
import org.springframework.web.reactive.function.server.ServerResponse;
import reactor.core.publisher.Mono;// 最基础的Reactor 实现
@Component //进行组件注册(让spring 识别并管理这个类 )
public class MessageHandler{ //这是一个WebFlux处理模块(接收请求,并处理请求)// 在 WebFlux 编程里面如果要进行响应的话会区分单个响应(单一对象)以及多个响应(集合)// Mono 只能接收单个对象 // 接收请求,并响应这个请求public Mono<ServerResponse>echoHandler(ServerRequest request){return ServerResponse.ok().header("Context-Type","text/html;charset=UTF-8"). //响应头信息body(BodyInserters.fromValue("沐言科技:www.yootk.com"));}
}
路由类 Router 类
package com.yootk.webflux.router;import com.yootk.webflux.handler.MessageHandler; // 导入Controller 类
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.web.reactive.function.server.*;@Configuration
public class MessageRouter { //消息路由处理@Bean // 进行路由的功能注册public RouterFunctions.route(RequestPredicates.GET("/echo"). // 匹配最终的处理路由地址add(RequestPredicates.accept(MediaType.TEXT_PLAIN)// 设置了匹配的请求类型,messageHandler::echoHandler); //匹配最终的处理路由地址}}
2、SpringBoot 整合 WebFlux
- 创建一个 VO 类 ==> Message , 这个类负责接收用户的请求数据
package com.yootk.vo;import lombok.Data;
import java.util.Date;@Data
public class Message {private String title;private Data pubdate;private String context;
}
- 创建一个 WebFlux 专属的请求处理类
package com.yootk.webflux.handler;import com.yootk,vo.Message;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.util.List;
import java.util.Map;@Component //进行组件注册
@Slf4j //日志输出
public class MessageHandler { //这是一个WebFlux 处理模块public Flux<Message> list(Message message) { //返回集合数据List<Message> messageList = new ArrayList<>(); //创建一个List 集合for (int x = 0;x<10;i++){ //10个长度的集合Message msg = new Message(); //创建新的Message 实例msg.setTitle("["+x+"]" + message.getTitle());msg.setContent("["+x+"]" + message.getContent());msg.setPubdate(message.getPubdate());// 直接使用已经配置的日期时间messageList.add(msg); //实现集合的存储}return Flux.fromIterable(messageList);// 实现了集合响应}// 每一次进行响应结果配置的时候,都只能够配置具体的类型public Flux<Map.Entry<String,Message>>map(Message message){Map<String,Message> map = new HashMap<>();for (int i = 0;i<10;i++) { // 通过迭代配置数据Message msg = new Message(); // 创建新的Message 实例msg.setTitle("["+ i + "]" + message.getTitle());msg.setContent("[" +i + "]" + message.getContent());msg.setPubdate(message.getPubdate());// 直接使用已经配置的日期时间map.put("yootk---" + i,msg); // 保存Map 集合}return Flux.fromIterable(map.entrySet());}//此时不再关注传统的ServerResponse以及ServletRequest类型了// Mono 只能处理单个对象public Mono<Message>echoHandler(Message message){ //直接以最终的数据类型进行操作log.info("{} 业务层接收处理数据:{}",Thread.currentThread().getName(),message);message.setTitle("["+Thread.currentThread.getName()+"]"+message.getTitle());message.setContent("["+Thread.currentThred().getName()+"]"+message.getContent());return Mono.create(monoSink->monoSink.success(message));// 实现数据响应}
}
- SpringBoot 之中所有的请求需要通过Action类(或者Controller) 进行访问,那么最佳的路由配置就是由Action类(或者Controller)进行处理了
package com.yootk.action;impo.rt com.yootk.vo.Message;
import com.yootk.webflux.handler.MessageHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.bean.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequstMapping("/message/*")
@Slf4j
public class MessageAction{ //正常访问的路由配置@Autowiredprivate MessgeHandler messageHandler; // WebFlux 处理程序@RequestMapping("echo")public Object echo(Message message){log.info("接收用户信息,用户发送的参数为: message = {}",message);return this.messageHandler.echoHandler(message);}// 请求url localhost:8080/message/list?title=沐言科技&content=www.yootk.com&pubdate=2025-10-01@RequestMapping("list")public Object list(Message message) {log.info ("接收用户根信息,用户发送的参数为: message = {}",message);return this.messageHandler.list(message);}// 请求url localhost:8080/message/map?title=沐言科技&content=www.yootk.com&pubdate=2025-10-01@RequestMapping("map")public Object map(Message message){log.info ("接收用户根信息,用户发送的参数为: message = {}",message);return this.messageHandler.map(message);}
}
- 使用 Flux 包装需要返回的集合数据信息(List集合、Map集合)
(Flux 能包装集合数据)
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
