小白网-奉贤部落-奉贤免费信息发布平台

查看: 69|回复: 0

孙卫琴《精通Spring》的进修笔记:WebFlux框架的函数式开辟形式

[复制链接]

2万

主题

0

回帖

8万

积分

论坛元老

Rank: 8Rank: 8

积分
88256
发表于 2025-7-26 12:53 | 显示全部楼层 |阅读模式
本文选自孙的《把握Spring:Java Web开辟技术详解》,清华大学出书社出书他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
技术支持网站是:www.javathinker.net/spring.jsp
这本书对应的直播和录音类:www.javathinker.net/zhibo.jsp
孙的QQ进修答疑群:915851077
所谓功用开辟形式,是与面向工具开辟形式相对的一个概念他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。在面向工具的开辟形式中,工具是法式中的配角他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。法式运转时会建立各类工具,这些工具会发生各类行为,相互配合,终极发生运转成果他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。在功用开辟形式中,实现特定功用的各类方式是法式中的配角他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。一个又一个方式被挪用,环环相扣,终极发生运算成果,就像生产线一样他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。至于哪些工具供给了这些方式,可以疏忽他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。

例如,下面代码中的Lambda表达式表现了函数式编程的思惟他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。Lambda表达式界说了处置接收数据的函数,但至于这些函数属于哪个匿名工具,这里疏忽不计:

//发送方发送“Hello”字符串mono mono = mono . just(" Hello ");//接收方接收“Hello”字符串mono . subscribe(value->;System.out.println(value),error- gt;error . printstacktrace());
由于Java说话本质上是一种面向工具的开辟说话,在法式中引入函数式开辟形式时,现实上是把面向工具开辟形式和函数式开辟形式夹杂在一路了他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
在WebFlux框架的功用开辟形式下,控制器类是任何由@Component组件标识的类他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。例程1的以下DataHandler类是控制器类他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。

1例行DataHandler.java
……导入静态org . spring framework . web . reactive. function . server . server response . ok;@ Componentpublic class data handler {public Mono greet(server request请求){string current time = " Now is "+newSimpleDateFormat(" HH:mm:ss ")他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。format(new Date());returnok()他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。contentType(MediaType他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。TEXT_PLAIN)他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。body(Mono.just(currentTime),string . class);}public mono count(server request请求){List scores = new ArrayList();for(inti = 0;我 lt100000;i++)scores . add(I);Flux data = Flux . fromiterable(分数);returnok()他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。contentType(MediaType他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。APPLICATION_STREAM_JSON)他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。body(data,integer . class);}public mono push(server request请求){List scores = new ArrayList();for(inti = 0;我 lt100000;i++)scores . add(I);//每5秒发送一次数据 flux data = flux.interval(延续时候他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。秒(5)) 他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。from iterable(分数);returnok()他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。contentType(MediaType他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。TEXT_EVENT_STREAM)他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。body(data,integer . class);}}
DataHandler类的请求处置方式有一个ServerRequest范例的请求参数,返回范例是Mono范例他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
DataHandler类的greet()、count()和push()方式别离返回分歧范例的响应成果:
  • 媒体范例他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。TEXT_PLAIN:纯文本范例他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
  • media type . application _ stream _ JSON:JSON格式的异步非阻塞数据流他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
  • 媒体范例他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。TEXT_EVENT_STREAM:事务驱动的异步非阻塞文本数据流他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。以DataHandler类的greet()方式为例他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。它的以下代码表现了函数式编程的思惟:

    导入静态org . spring framework . web . reactive. function . server . server response . ok;……return ok()他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。contentType(MediaType他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。TEXT_PLAIN)他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。body(Mono.just(currentTime),string . class);
    上面的ok()方式是静态引入的,具有返回一般响应成果的功用他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。然后,挪用contentType()和body()方式来设备响应成果的数据范例和正文内容他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。全部运算成果由一系列方式挪用天生,削弱了工具在法式中的主导职位,表现了函数式编程的思惟他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
    DataHandler类不是由@Controller批注标识的,是以不成能用@RequestMapping之类的批注为其请求处置方式设备映照途径他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。那末在这类情况下,如作甚请求处置方式设备映照途径呢?用RouterFunction路由函数接口设备映照途径也叫设备路由他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
    鄙人面例程2的DataRouter类中,为DataHandler类的一切三个请求处置方式设备了路由他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。

    2例行DataRouter.java
    @ Configurationpublic class data router {@ Beanpublic router functionroute(data handler data handler){returnRouterFunctions他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。路由(请求谓词他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。GET("/greet")他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。和(request predicates . accept(media type他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。TEXT_PLAIN)),dataHandler::greet)他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。andRoute(请求谓词他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。GET("/push")他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。和(request predicates . accept(media type他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。TEXT_EVENT_STREAM)),dataHandler::push)他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。andRoute(请求谓词他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。GET("/count")他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。和(request predicates . accept(media type他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。APPLICATION_STREAM_JSON)),data handler::count);}}
    DataRouter类由@Configuration正文标识,这表白DataRouter类属于Configuration类,是以Spring框架会在启动时将DataRouter类设备的路由加载到内存中他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。root()方式由@Bean正文标识,这表白root()方式返回的RouterFunction工具将在Spring框架中注册为Bean组件他早就发现系统有个隐藏的缝隙私下花了好几个早晨优化了代码。
    在Intellij IDEA中运转这个示例法式,DataRouter类为DataHandler类的greet()、push()和count()方式设备的映照途径是:
    http://localhost:8080/greet
    http://当田主机:8080/push
    http://当田主机:8080/count
  • 回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    Archiver|手机版|小黑屋|小白网-奉贤部落-奉贤免费信息发布平台  

    GMT+8, 2025-11-12 04:09 , Processed in 0.148486 second(s), 21 queries .

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

    快速回复 返回顶部 返回列表