Spring WebFlux 发表于 2022-12-20 | 分类于 ---WebFlux | 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108// request 来,response出,所以不需要返回值 => Mono<Void>public interface WebHandler { Mono<Void> handle(ServerWebExchange exchange);}public interface ServerWebExchange { ServerHttpRequest getRequest(); ServerHttpResponse getResponse();}每一个路径对应一个 handler "/user" => user handler "/order" => order handlerMono<Handler> handler = getHandler(path);Handler 可能有很多种,可以设置为 Object,使用的时候再强转就可以了,路径可以从 exchange 中获取到,public interface HandlerMapping { Mono<Object> getHandler(ServerWebExchange exchange);}public class DispatcherHandler implements WebHandler, PreFlightRequestHandler, ApplicationContextAware { @Override public Mono<Void> handle(ServerWebExchange exchange) {// ...省略部分代码 return Flux.fromIterable(this.handlerMappings) .concatMap(mapping -> mapping.getHandler(exchange))// 获取 handler => 可能有多个,下面 next() 取第一个 .next() .switchIfEmpty(createNotFoundError()) .flatMap(handler -> invokeHandler(exchange, handler)) .flatMap(result -> handleResult(exchange, result)); } private Mono<HandlerResult> invokeHandler(ServerWebExchange exchange, Object handler) {// ...省略部分代码 for (HandlerAdapter handlerAdapter : this.handlerAdapters) { if (handlerAdapter.supports(handler)) { return handlerAdapter.handle(exchange, handler); } } return Mono.error(new IllegalStateException("No HandlerAdapter: " + handler)); }}// HandlerFunction => 如下// @Configuration// public class RouterConfiguration {// @Bean// RouterFunction<ServerResponse> userRouterFunction(UserHandler userHandler) {// return RouterFunctions.nest(RequestPredicates.path("/user"),// RouterFunctions.route(RequestPredicates.GET("/getAllUser"), userHandler::getAllUsers)// .andRoute(RequestPredicates.POST("/addUser"), userHandler::addUser)// .andRoute(RequestPredicates.DELETE("/{userId}"), userHandler::deleteUser));// }// }public class HandlerFunctionAdapter implements HandlerAdapter { @Override public boolean supports(Object handler) { return handler instanceof HandlerFunction; } @Override public Mono<HandlerResult> handle(ServerWebExchange exchange, Object handler) { // ...省略 }}// @RequestMapping => 如下// @RestController// @RequestMapping("/user")// public class UserController {// @Autowired// private UserRepository userRepository;// // @RequestMapping("/getAllUser")// public Flux<User> getAllUser() {// Flux<User> userFlux = userRepository.findAll();// return userFlux;// }// // @RequestMapping("/addUser")// public Mono<User> addUser(User user) {// Mono<User> mono = userRepository.save(user);// return mono;// }// }public class RequestMappingHandlerAdapter implements HandlerAdapter, ApplicationContextAware, InitializingBean { @Override public boolean supports(Object handler) { return handler instanceof HandlerMethod; } @Override public Mono<HandlerResult> handle(ServerWebExchange exchange, Object handler) { // ...省略 }}