范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

SpringWebFlux核心处理组件DispatcherHandler

  环境:SpringBoot2.4.12
  请先阅读:
  Spring WebFlux使用函数式编程之HandlerFunction(1)
  Spring WebFlux使用函数式编程之RouterFunction(2)
  Spring WebFlux请求处理流程
  一文带你彻底理解Spring WebFlux的工作原理 Reactor响应式编程(Flux、Mono)基本用法
  概述
  与Spring MVC类似,Spring WebFlux是围绕前端控制器模式设计的,其中核心处理程序 WebHandler  的实现 DispatcherHandler 为请求处理提供共享算法,而实际工作由可配置的委托组件执行。该模型非常灵活,支持多种工作流。
  DispatcherHandler 从Spring配置中发现所需的委托组件。它本身也被设计为bean,并实现ApplicationContextAware 以访问它运行的上下文。如果DispatcherHandler 是用webHandler的bean名称声明的,那么WebHttpHandlerBuilder 会发现它,它会将请求处理链组合在一起,如webHandler API中所述。
  WebFlux应用程序中的Spring配置通常包含:bean名称为webHandler的DispatcherHandler WebFilter 和WebExceptionHandler DispatcherHandler 特殊bean其它
  配置被提供给WebHttpHandlerBuilder 以构建处理链,如下例所示:public class HttpHandlerAutoConfiguration {   @Configuration(proxyBeanMethods = false)   public static class AnnotationConfig {     @Bean     public HttpHandler httpHandler(ObjectProvider propsProvider) {       // applicationContext方法中会收集容器中WebFilter和WebExceptionHandler       // build方法中构建了HttpWebHandlerAdapter(实现了HttpHandler),该对象中       // 包装了WebFilter和WebExceptionHandler集合       HttpHandler httpHandler = WebHttpHandlerBuilder.applicationContext(this.applicationContext).build();       WebFluxProperties properties = propsProvider.getIfAvailable();       if (properties != null && StringUtils.hasText(properties.getBasePath())) {         Map handlersMap = Collections.singletonMap(properties.getBasePath(), httpHandler);         return new ContextPathCompositeHandler(handlersMap);       }       return httpHandler;     }   } }特殊一样的Bean
  DispatcherHandler 委托特殊bean处理请求并呈现适当的响应。所谓"特殊bean",是指实现WebFlux框架规定的Spring管理的对象实例。一般都内置这些Bean,不过你可以自定义、扩展或替换它们的属性。 HandlerMapping
  将请求映射到处理程序。映射基于一些标准,这些标准的细节因HandlerMapping 实现的不同而不同——注释控制器、简单URL模式映射等等。如:@RequestMapping 注解的Controller或RouterFunction 类型的Bean他们都是由不同的HandlerMapping 来处理。HandlerAdapter
  帮助DispatcherHandler 调用映射到请求的处理程序,而不管该处理程序实际是如何调用的。例如,调用带注释的控制器需要解析注释。HandlerAdapter 的主要目的是保护DispatcherHandler 不受这些细节的影响。简单说就是不同的HandlerAdapter 处理由不同HandlerMapping 返回的不同的Handler对象,比如:RequestMappingHandlerMapping 返回的HandlerMethod ,RouterFunctionMapping 返回的HandlerFunction 。HandlerResultHandler
  处理处理程序调用的结果并完成响应。WebFlux配置
  应用程序可以声明处理请求所需的基础bean(列在Web Handler API和DispatcherHandler下面)。但是,在大多数情况下,WebFlux配置是最好的起点。它声明所需的bean,并提供更高级别的配置回调API来自定义它。请求处理
  DispatcherHandler 处理请求的方式如下:每个HandlerMapping 被要求找到一个匹配的处理程序,并使用第一个匹配。如果找到处理程序,则通过适当的HandlerAdapter 运行它,它将从执行中返回的值公开为HandlerResult 。HandlerResult 被提供给适当的HandlerResultHandler ,以通过直接写入响应或使用视图进行渲染来完成处理。结果处理
  调用处理程序的返回值通过HandlerAdapter 被包装为HandlerResult ,以及一些附加的上下文,并传递给声称支持它的第一个HandlerResultHandler 。下表列出可用的HandlerResultHandler 实现,所有这些实现都在WebFlux Config中声明:ResponseEntityResultHandler
  返回值:ResponseEntity , 通常来自 @Controller 实例。 ServerResponseResultHandler
  返回值:ServerResponse ,通常来自功能端点。ResponseBodyResultHandler
  返回值:处理来自@ResponseBody 方法或@RestController 类的返回值。ViewResolutionResultHandler
  返回值:CharSequence、视图、模型、映射、渲染或任何其他对象都被视为模型属性。异常处理
  从HandlerAdapter 返回的HandlerResult 可以基于某些特定于处理程序的机制公开用于错误处理的函数。在以下情况下调用此错误函数:处理程序(例如,@Controller)调用失败。通过HandlerResultHandler 处理处理程序返回值失败。
  只要错误信号发生在从处理程序返回的响应类型产生任何数据项之前,error函数就可以更改响应(例如,更改为错误状态)。
  这就是如何支持@Controller类中的@ExceptionHandler方法。相比之下,Spring MVC中的支持也是建立在 HandlerExceptionResolver 上的。注意:在WebFlux中,不能使用 @ControllerAdvice 来处理在选择处理程序之前发生的异常。 @RestControllerAdvice public class PackControllerAdvice {    @ExceptionHandler   public ResponseEntity handle(Exception ex) {     ex.printStackTrace();     return ResponseEntity.ok(ex.getMessage() + ", Advice");   }  }
  注意:这个不能处理调用处理程序之前的任何异常,处理程序之前的异常应该由WebExceptionHandler 来处理
  下面的异常处理句柄将会处理,由WebFilter 实例链和目标WebHandle 的异常。@Component @Order(Ordered.HIGHEST_PRECEDENCE) public class CustomWebExceptionHandler implements WebExceptionHandler {    @Override   public Mono handle(ServerWebExchange exchange, Throwable ex) {     System.out.println("异常了: " + ex.getMessage()) ;     // 将错误传递下去,后面的onErrorResume还可以继续执行;如果传递,那么下一个处理器将会是DefaultErrorWebExceptionHandler     // return Mono.error(ex) ;     // exchange.getResponse()     // return Mono.error(ex) ;     // 下面不传递异常了,直接输出错误信息     ServerHttpResponse response = exchange.getResponse() ;     response.setStatusCode(HttpStatus.INTERNAL_SERVER_ERROR) ;     response.getHeaders().add("ContentType", "text/html;charset=utf8");     return response.writeWith(Mono.just(exchange.getResponse().bufferFactory().wrap("ERROR".getBytes(Charset.forName("UTF-8"))))) ;   }  }
  完毕!!!
  Spring中Aware接口实现原理解析
  Spring Cloud Nacos 开启权限验证
  Spring Cloud Nacos配置中心实现原理
  Spring IOC容器对Bean实例化的过程详解源码分析
  使用Spring Boot Admin实时监控你的系统
  Spring注解@Qualifier这种用法你知道吗?
  Spring AOP切入点类型及系统提供的非常常用的切入点
  Spring Cloud Gateway应用详解1之谓词

世界杯爆冷门!争冠热门仅排第3,生死战前爆出矛盾,恐遭淘汰2022世界杯北京时间2022年11月29日,卡塔尔世界杯小组赛前两轮全部结束,争冠热门球队中,法国巴西葡萄牙提前晋级16强,英格兰荷兰西班牙等强队也掌握着晋级主动权。德国队和比利男乒新力量,未来可期王楚钦,2000年5月11日出生于吉林省吉林市,中国男子乒乓球运动员,效力于中国男子乒乓球队,00后天才少年王楚钦非常帅气,是主力队员中年龄最小的一个。2017年国家队集训时,他有信通院报告律师行业企查查渗透率超5成近日,中国信息通信研究院发布企业信用大数据行业发展研究报告(以下简称报告),对中国企业信用大数据行业发展现状未来趋势作出预测。报告指出,中国企业信用大数据行业规模已突破千亿元,应用直播行业风停了,周鸿祎头铁携花房三闯IPO第二梯队的花房,是资本市场的迟到者在三六零(601360。SH)曝出亏损近20亿之际,三六零(601360。SH)孵化并投资的的花房集团(下称花房)却在资本市场取得很大进展。11月想告诉全世界这个懒人焖饭好吃到破防了讲真的这个腊肠土豆焖饭真的巨巨巨好吃!!热呼呼的一大锅,土豆软绵可口,一口下去好满足其实做法很简单,随手一做就可以,比平时煮饭水少一点,就能做出粒粒分明的焖饭啦食材土豆腊肠玉米胡萝最低430分!福建警察学院2022年福建省录取分数学校小百科福建警察学院创办于1949年,主校区位于福州市仓山区。学校是福建省属公立的政法类本科高校。学校现有3个国家级一流本科专业(侦查学刑事科学技术警务指挥与战术)和3个省级一流宣华夫人在杨坚死后又获宠于隋炀帝杨广,为何只一年就香消玉殒?宣华夫人陈氏是南北朝时陈国公主,陈宣帝女儿,陈后主妹妹,被隋朝灭国后,配入掖庭为宫女,后被隋文帝杨坚收入后宫,封为夫人。宣华夫人之所以在历史上成名,不是因为她的美貌和多情,而是因为3场轰9球!世界第5创世界杯新纪录,18决赛对手正式出炉说起英格兰球员,外界的印象一直都是技术粗糙,可曾想,英格兰队竟然是世界杯赛场上直接任意球破门的制造者。是的,世界杯最近两粒任意球直接破门,均由英格兰队完成,分别是拉什福德和特里皮尔世界杯成最佳验货基地?皇马盯上两大新星,接班克罗斯本泽马?都说时势造英雄,在世界杯这个舞台上,我们见证过无数的年轻球员横空出世,比如说10年的托马斯。穆勒,14年的J罗,18年的姆巴佩等等,世界杯的整体竞技水平虽然比不上欧冠,但对于所有球海南火莲花地质景区废弃矿山变身3A景区海南日报记者林书喜近日,走进海南火莲花地质景区,干净整洁的花岗石板,郁郁葱葱的草木,古色古香的建筑,五颜六色的九品莲浮在水面上,令人赏心悦目。更为独特的是,山体还有一个数亿年前形成李雨生万佛寺揽胜万佛寺揽胜初识万佛寺源于一次盘山之旅。那年暑假,我们老两口和几个姐妹带着孙子去了盘山,就住在前盘山的农家院里。我有个习惯,只要是安顿好了之后,就要找农家院的老板打听附近有什么景点,
欧冠曼彻斯特城VS多特蒙德比分预测这场欧冠小组赛将在北京时间9月15日凌晨3点举行,曼彻斯特城将在主场迎战多特蒙德。曼彻斯特城是上个赛季英超联赛冠军,本赛季暂时排在联赛第2位。多特蒙德是上个赛季德甲联赛亚军,本赛季第19所!西北大学,上天了9月13日上午,国际天文学联合会发布公告,经小天体命名工作组批准,国际永久编号为529729号的小行星以西北大学命名,称为Xida星西大星。官方公告显示,Xida星由中国科学院紫金宇宙起源将被改写?韦伯望远镜在宇宙深处,发现了意料之外的景象头条创作挑战赛关于宇宙的起源,人们曾经提出了各式各样的假说,其中的一种被称为大爆炸宇宙论(TheBigBangTheory)的理论最终脱颖而出,得到了科学界的普遍认同。简而言之,该打破常识!不用断肢,也能在真空中移动图片来源Unsplash左脚踩右脚如何上天?也许你大力将一只脚踩断,让这只脚以超快(最好能到光速)的速度向下飞出去,就能向上飞一小段距离(毕竟整个身体要比一只脚重得多)。好消息是,没有人能阻止你花2。5万元购买三星奥德赛方舟三星的庞然大物OdysseyArk是一款售价3,500美元(24234元人民币)的55英寸曲面游戏显示器,经过几周的预购后,今天开始发售。三星奥德赛方舟是最荒谬和令人惊叹的游戏显示坚持免费换电池服务!魅族焕新计划再启动,老用户都说好在手机厂商被称之为良心的行动中,由魅族举办的产品焕新计划得到了用户与市场的肯定,尽最大努力为魅友提供方便的举措让不少人以零成本让手机重生。在经过前两次的焕新计划后,官方确定了第三批苹果惊喜升级AppleCare服务1年可无限次意外维修188元换屏尽管没有在发布会上明说,但iPhone14推出之后,苹果官方悄然调整了AppleCare服务支持的内容。最大的变化就是取消意外损坏的保修次数限制,过去是一年最多两次,现在则是无限次苹果终于出手打压!iOS16支持检测假冒AirPods,买山寨不如买大牌或许是山寨AirPods过于猖獗,苹果官方终于忍不住出手,宣布iOS16支持检测山寨AirPods。有网友更新了iOS16后,用山寨AirPods连接到iPhone,结果发现弹出了海尔新风空调这么火爆的原因我找到了最近两年里新风空调成为了空调行业的新宠,我也赶个潮流,今年把家里的空调换成了海尔新风空调。用过之后,才真正了解到为什么大家都要换新风空调新风空调如此受到大家追捧的原因是,它在传统空美国3次高价求购被拒重要性不输于光刻机,3D金属打印有多牛?曾几何时,美国一度是世界上经济最为发达的国家,它在高科技产业领域,领先于其他国家,掌握了大量高科技技术,研发能力也很强,不断创新出各类新科技。二十一世纪是一个智能化数字化科技化的时美国8月CPI同比涨幅仍处于历史高位新华社华盛顿9月13日电(记者许缘)美国劳工部13日公布的数据显示,今年8月美国消费者价格指数(CPI)环比增长0。1,同比增长8。3,同比涨幅仍维持在历史高位。数据显示,美国通胀