Spring5中Reactor编程的Mono与Flux类源码解读
Spring5的函数式编程使⽤了ProjectReactor⼯程的类,使⽤最为多的就是Mono和Flux类型,其中Mono是针对0到1个元素进⾏操
作,Flux是针对多个元素进⾏操作。要使⽤这两个类前提是⾃⼰要有jdk8,Lambda,函数式编程的基础,否则请先学习了以上知识再来接触Spring5的Mono和FLux。
体育保健学我们针对Mono类的⼀⾏代码,来进⾏源码分析与讲解。代码如下:
Mono.just("hello").subscribe(System.out::println);
有什么歌好听
这⾏代码是⽣成有⼀个元素的Mono类,并打印“hello”字符串。
⾸先,通过Mono.just()⽅法⽣成了Mono类
public static <T> Mono<T> just(T data) {
天狼星areturn onAsmbly(new MonoJust<>(data));
}
以上代码可以看到是创建了⼀个MonoJust类型,这个类和Mono,FLux类型⼀样在reactor-core包中,其实Mono的每个⽅法都会对应⽣成⼀个Mono的⼦类,其⼦类很多,如下:
截图只是列举了⼀部分,Mono采⽤这种每个⽅法都⽣成⼀个类的⽅式是与jdk8中的Stream流⽔线的最⼤区别,⽬的是为了重⽤任意阶段的结果,且其所有⼦类都实现了Mono类的⽅法:
public abstract void subscribe(CoreSubscriber<? super T> actual);
锅巴土豆
这个⽅法我们后⾯会讲,它的作⽤就是处理后⾯的函数式的逻辑。防保科>诈尸式育儿
在返回MonoJust类型后,我们调⽤了subscribe(System.out::println)⽅法,这个⽅法在Mono类有具体实现,⽅法如下:
public final Disposable subscribe(Consumer<? super T> consumer) {
return subscribe(consumer, null, null);
}
这个⽅法是所有Mono的⼦类执⾏subscribe(CoreSubscriber<? super T> actual)⽅法的⼊⼝,我们进⼊看下,执⾏到了如下⽅法:
连锁店怎样加盟public final Disposable subscribe(
@Nullable Consumer<? super T> consumer,
@Nullable Consumer<? super Throwable> errorConsumer,
@Nullable Runnable completeConsumer,
@Nullable Consumer<? super Subscription> subscriptionConsumer) {
return subscribeWith(new LambdaMonoSubscriber<>(consumer, errorConsumer,
completeConsumer, subscriptionConsumer));
}
我们看到有四个参数,根据字⾯意思即可理解,lambda表达式是第⼀个参数consumer,可以看到执⾏Lambda的⽅法时候创建了⼀个类型LambdaMonoSubscriber,这个类型封装了封装了四个参数。
后⾯进⼊此⽅法:
@Override
public final void subscribe(Subscriber<? super T> actual) {
onLastAsmbly(this).CoreSubscriber(actual));
}
这个⽅法是重写了⽗类Publisher的suscribe⽅法,我们看到代码做了类型转换,通过类型转换就转换为了可以调⽤MonoJust中的subscribe⽅法了,MonoJust总的subscribe⽅法如下,所有的Mono⼦类都重写了此⽅法:
@Override
public void subscribe(CoreSubscriber<? super T> actual) {
}
然后通过LambdaMonoSubscriber的onSubscribe⽅法在调⽤Operators的request⽅法,再调⽤此LambdaMonoSubscriber的onNext⽅法,最后调⽤了我们⾃⼰写的Lambda表达式,如下:
@Override
public final void onNext(T x) {
Subscription s = S.getAndSet(this, Operators.cancelledSubscription());
if (s == Operators.cancelledSubscription()) {
return;
}
if (consumer != null) {
try {
二类本科consumer.accept(x);
}
consumer就是我们传⼊进来的Lambda表达式,这个⽅法继承⾃Suscriber类
通过这种⽅式,Publisher发送的subscribe就被Subscriber类消费掉了。其实全程都是⼀个单线程的操作。借鉴了消费订阅模式。
关于Mono的⽅法很多,在此只是举了⼀个简单的例⼦,其他的⽅法也可以通过类似的⽅式去研究。
在此处有⼀篇