Java高手速成 | WebFlux框架的函数式开发模式
创始人
2024-05-24 18:46:11
0

WebFlux框架的函数式开发模式

01、WebFlux框架的函数式开发模式

所谓函数式开发模式,是和面向对象开发模式相对的一个概念。在面向对象的开发模式中,对象是程序中的主角,程序在运行时会创建各种对象,这些对象产生各种行为,彼此之间互相协作,最后产生运算结果。而在函数式开发模式中,实现特定功能的各种方法是程序中的主角,一个接一个的方法被调用,环环相扣,最后产生运算结果,就像生产流水线一样,而至于到底是哪些对象来提供这些方法,可以被忽略。

例如以下代码中的Lambda表达式就体现了函数式编程思想,Lambda表达式定义了处理所接收到的数据的功能,而至于这些功能属于哪个匿名对象,在这里被忽略:

//发送方发送“Hello”字符串
Mono mono=Mono.just(“Hello”);//接收方按照异步非阻塞方式接收“Hello”字符串
mono.subscribe(value -> System.out.println(value),error -> error.printStackTrace()
);

由于Java语言本质是面向对象的开发语言,因此,程序在引入函数式开发模式时,实际上是面向对象开发和函数式开发两种模式夹杂在一起。

在WebFlux框架的函数式开发模式中,控制器类是任意的用@Component组件标识的类。以下例程1的DataHandler类就是控制器类。

例程1  DataHandler.java

……
import static org.springframework.web.reactive.function.server.ServerResponse.ok;
@Component
public class DataHandler {public Mono greet(ServerRequest request) {StringcurrentTime="Now is "+ newSimpleDateFormat("HH:mm:ss").format(new Date());returnok().contentType(MediaType.TEXT_PLAIN).body(Mono.just(currentTime),String.class);}publicMono count(ServerRequest request) {List scores=new ArrayList();for(inti=0;i<100000;i++)scores.add(i);Flux data=Flux.fromIterable(scores);returnok().contentType(MediaType.APPLICATION_STREAM_JSON).body(data,Integer.class);}publicMono push(ServerRequest request) {List scores=new ArrayList();for(inti=0;i<100000;i++)scores.add(i);//间隔5秒发送一次数据Flux data=Flux.interval(Duration.ofSeconds(5)).fromIterable(scores);returnok().contentType(MediaType.TEXT_EVENT_STREAM).body(data,Integer.class);}
}

 

DataHandler类的请求处理方法有一个表示客户请求的ServerRequest类型的请求参数,返回类型是Mono类型。

DataHandler类的greet()、count()和push()方法分别返回不同类型的响应结果:

1.MediaType.TEXT_PLAIN:纯文本类型。

2.MediaType.APPLICATION_STREAM_JSON:JSON格式的异步非阻塞的数据流。

3.MediaType.TEXT_EVENT_STREAM:事件驱动的异步非阻塞的文本数据流。

以DataHandler类的greet()方法为例,它的以下代码体现了函数式编程的思想:

import static org.springframework.web.reactive.function.server.ServerResponse.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

@Configuration
public class DataRouter {@Beanpublic RouterFunction route(DataHandler dataHandler) {returnRouterFunctions.route(RequestPredicates.GET("/greet").and(RequestPredicates.accept(MediaType.TEXT_PLAIN)),dataHandler::greet).andRoute(RequestPredicates.GET("/push").and(RequestPredicates.accept(MediaType.TEXT_EVENT_STREAM)),dataHandler::push).andRoute(RequestPredicates.GET("/count").and(RequestPredicates.accept(MediaType.APPLICATION_STREAM_JSON)),dataHandler::count);}
}

 

DataRouter类用@Configuration注解来标识,表明DataRouter类属于配置类,因此Spring框架在启动时会把DataRouter类设定的路由加载到内存中。root()方法用@Bean注解标识,表明root()方法返回的RouterFunction对象会作为Bean组件注册到Spring框架中。

在Intellij IDEA中运行本范例程序,DataRouter类为DataHandler类的greet()、push()和count()方法设定的映射路径分别为:

http://localhost:8080/greet

http://localhost:8080/push

http://localhost:8080/count

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...