激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務器之家 - 編程語言 - Java教程 - SpringBoot2使用WebFlux函數式編程的方法

SpringBoot2使用WebFlux函數式編程的方法

2021-05-24 13:50大老楊 Java教程

這篇文章主要介紹了SpringBoot2使用WebFlux函數式編程的方法,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

本文只是簡單使用springboot2使用webflux的函數式編程簡單使用,后續會繼續寫關于webflux相關的文章。

最近一直在研究webflux,后續會陸續出一些相關的文章。

首先看一下srping官網上的一張圖,對比一下springmvc和spring webflux,如圖:

SpringBoot2使用WebFlux函數式編程的方法

在查看一下webflux的官方文檔:https://docs.spring.io/spring/docs/current/spring-framework-reference/web-reactive.html,webflux提供了函數式編程,本文簡單介紹一下webflux函數式編程簡單使用。

新建項目

創建一個項目,pom文件中引入webflux依賴,完整pom文件如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<?xml version="1.0" encoding="utf-8"?>
<project xmlns="http://maven.apache.org/pom/4.0.0" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"
     xsi:schemalocation="http://maven.apache.org/pom/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelversion>4.0.0</modelversion>
 
  <groupid>com.dalaoyang</groupid>
  <artifactid>springboot2_webflux</artifactid>
  <version>0.0.1-snapshot</version>
  <packaging>jar</packaging>
 
  <name>springboot2_webflux</name>
  <description>springboot2_webflux</description>
 
  <parent>
    <groupid>org.springframework.boot</groupid>
    <artifactid>spring-boot-starter-parent</artifactid>
    <version>2.0.3.release</version>
    <relativepath/> <!-- lookup parent from repository -->
  </parent>
 
  <properties>
    <project.build.sourceencoding>utf-8</project.build.sourceencoding>
    <project.reporting.outputencoding>utf-8</project.reporting.outputencoding>
    <java.version>1.8</java.version>
  </properties>
 
  <dependencies>
    <dependency>
      <groupid>org.springframework.boot</groupid>
      <artifactid>spring-boot-starter</artifactid>
    </dependency>
 
    <dependency>
      <groupid>org.springframework.boot</groupid>
      <artifactid>spring-boot-starter-test</artifactid>
      <scope>test</scope>
    </dependency>
 
    <dependency>
      <groupid>org.springframework.boot</groupid>
      <artifactid>spring-boot-starter-webflux</artifactid>
    </dependency>
  </dependencies>
 
  <build>
    <plugins>
      <plugin>
        <groupid>org.springframework.boot</groupid>
        <artifactid>spring-boot-maven-plugin</artifactid>
      </plugin>
    </plugins>
  </build>
 
 
</project>

首先試試引入webflux依賴之后,springmvc方式是否還能使用,新建一個hellocontroller,完整代碼如下,執行后發現,是可以正常執行訪問的,這其實就是我們所說的注解式編程。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.dalaoyang.controller;
 
import org.springframework.web.bind.annotation.getmapping;
import org.springframework.web.bind.annotation.restcontroller;
 
/**
 * @author dalaoyang
 * @project springboot_learn
 * @package com.dalaoyang.controller
 * @email yangyang@dalaoyang.cn
 * @date 2018/7/30
 */
@restcontroller
public class hellocontroller {
 
  @getmapping("hello")
  public string hello(){
    return "hello this is springwebflux";
  }
}

結果如圖:

SpringBoot2使用WebFlux函數式編程的方法

接下來使用函數式編程,首先查閱一下官方文檔,如圖:

SpringBoot2使用WebFlux函數式編程的方法

我們需要創建一個handlerfunction返回值為mono,新建一個hihandler,里面寫一個方法hi,完整代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package com.dalaoyang.handler;
import org.springframework.http.mediatype;
import org.springframework.stereotype.component;
import org.springframework.web.reactive.function.bodyinserters;
import org.springframework.web.reactive.function.server.serverrequest;
import org.springframework.web.reactive.function.server.serverresponse;
import reactor.core.publisher.mono;
 
 
/**
 * @author dalaoyang
 * @project springboot_learn
 * @package com.dalaoyang.handler
 * @email yangyang@dalaoyang.cn
 * @date 2018/7/30
 */
@component
public class hihandler {
 
 
  public mono<serverresponse> hi(serverrequest request) {
    return serverresponse.ok().contenttype(mediatype.application_json)
        .body(bodyinserters.fromobject("hi , this is springwebflux"));
  }
}

其中serverresponse是相應的封裝對象,下面是它的源碼,其中包含了響應狀態,響應頭等等,代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
package org.springframework.web.reactive.function.server;
 
import java.net.uri;
import java.time.zoneddatetime;
import java.util.list;
import java.util.map;
import java.util.set;
import java.util.function.bifunction;
import java.util.function.consumer;
import org.reactivestreams.publisher;
import org.springframework.core.parameterizedtypereference;
import org.springframework.http.cachecontrol;
import org.springframework.http.httpheaders;
import org.springframework.http.httpmethod;
import org.springframework.http.httpstatus;
import org.springframework.http.mediatype;
import org.springframework.http.responsecookie;
import org.springframework.http.codec.httpmessagewriter;
import org.springframework.http.server.reactive.serverhttpresponse;
import org.springframework.util.multivaluemap;
import org.springframework.web.reactive.function.bodyinserter;
import org.springframework.web.reactive.result.view.viewresolver;
import org.springframework.web.server.serverwebexchange;
import reactor.core.publisher.mono;
 
public interface serverresponse {
  httpstatus statuscode();
 
  httpheaders headers();
 
  multivaluemap<string, responsecookie> cookies();
 
  mono<void> writeto(serverwebexchange var1, serverresponse.context var2);
 
  static serverresponse.bodybuilder from(serverresponse other) {
    return new defaultserverresponsebuilder(other);
  }
 
  static serverresponse.bodybuilder status(httpstatus status) {
    return new defaultserverresponsebuilder(status);
  }
 
  static serverresponse.bodybuilder status(int status) {
    return new defaultserverresponsebuilder(status);
  }
 
  static serverresponse.bodybuilder ok() {
    return status(httpstatus.ok);
  }
 
  static serverresponse.bodybuilder created(uri location) {
    serverresponse.bodybuilder builder = status(httpstatus.created);
    return (serverresponse.bodybuilder)builder.location(location);
  }
 
  static serverresponse.bodybuilder accepted() {
    return status(httpstatus.accepted);
  }
 
  static serverresponse.headersbuilder<?> nocontent() {
    return status(httpstatus.no_content);
  }
 
  static serverresponse.bodybuilder seeother(uri location) {
    serverresponse.bodybuilder builder = status(httpstatus.see_other);
    return (serverresponse.bodybuilder)builder.location(location);
  }
 
  static serverresponse.bodybuilder temporaryredirect(uri location) {
    serverresponse.bodybuilder builder = status(httpstatus.temporary_redirect);
    return (serverresponse.bodybuilder)builder.location(location);
  }
 
  static serverresponse.bodybuilder permanentredirect(uri location) {
    serverresponse.bodybuilder builder = status(httpstatus.permanent_redirect);
    return (serverresponse.bodybuilder)builder.location(location);
  }
 
  static serverresponse.bodybuilder badrequest() {
    return status(httpstatus.bad_request);
  }
 
  static serverresponse.headersbuilder<?> notfound() {
    return status(httpstatus.not_found);
  }
 
  static serverresponse.bodybuilder unprocessableentity() {
    return status(httpstatus.unprocessable_entity);
  }
 
  public interface context {
    list<httpmessagewriter<?>> messagewriters();
 
    list<viewresolver> viewresolvers();
  }
 
  public interface bodybuilder extends serverresponse.headersbuilder<serverresponse.bodybuilder> {
    serverresponse.bodybuilder contentlength(long var1);
 
    serverresponse.bodybuilder contenttype(mediatype var1);
 
    serverresponse.bodybuilder hint(string var1, object var2);
 
    <t, p extends publisher<t>> mono<serverresponse> body(p var1, class<t> var2);
 
    <t, p extends publisher<t>> mono<serverresponse> body(p var1, parameterizedtypereference<t> var2);
 
    mono<serverresponse> syncbody(object var1);
 
    mono<serverresponse> body(bodyinserter<?, ? super serverhttpresponse> var1);
 
    mono<serverresponse> render(string var1, object... var2);
 
    mono<serverresponse> render(string var1, map<string, ?> var2);
  }
 
  public interface headersbuilder<b extends serverresponse.headersbuilder<b>> {
    b header(string var1, string... var2);
 
    b headers(consumer<httpheaders> var1);
 
    b cookie(responsecookie var1);
 
    b cookies(consumer<multivaluemap<string, responsecookie>> var1);
 
    b allow(httpmethod... var1);
 
    b allow(set<httpmethod> var1);
 
    b etag(string var1);
 
    b lastmodified(zoneddatetime var1);
 
    b location(uri var1);
 
    b cachecontrol(cachecontrol var1);
 
    b varyby(string... var1);
 
    mono<serverresponse> build();
 
    mono<serverresponse> build(publisher<void> var1);
 
    mono<serverresponse> build(bifunction<serverwebexchange, serverresponse.context, mono<void>> var1);
  }
}

在回過頭了看上面官方文檔的圖片,還需要配置一個路由來類似@requestmapping的功能,通過routerfunctions.route(requestpredicate, handlerfunction)提供了一個路由器函數默認實現,新建一個hirouter,代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package com.dalaoyang.router;
 
import com.dalaoyang.handler.hihandler;
import org.springframework.context.annotation.bean;
import org.springframework.context.annotation.configuration;
import org.springframework.http.mediatype;
import org.springframework.web.reactive.function.server.requestpredicates;
import org.springframework.web.reactive.function.server.routerfunction;
import org.springframework.web.reactive.function.server.routerfunctions;
import org.springframework.web.reactive.function.server.serverresponse;
/**
 * @author dalaoyang
 * @project springboot_learn
 * @package com.dalaoyang.router
 * @email yangyang@dalaoyang.cn
 * @date 2018/7/30
 */
@configuration
public class hirouter {
  @bean
  public routerfunction<serverresponse> routecity(hihandler hihandler) {
    return routerfunctions
        .route(requestpredicates.get("/hi")
                .and(requestpredicates.accept(mediatype.application_json)),
            hihandler::hi);
  }
}

啟動項目,通過控制臺可以看到,兩種方式的映射都被打印出來了,如圖所示:

SpringBoot2使用WebFlux函數式編程的方法

在瀏覽器訪問,http://localhost:8080/hi,結果如圖所示:

SpringBoot2使用WebFlux函數式編程的方法

源碼下載 :大老楊碼云

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/qq_33257527/article/details/81300802

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 免费一区区三区四区 | 亚洲精品午夜视频 | 久久久在线免费观看 | 亚洲精品a在线观看 | 99re66热这里只有精品8 | 国产精品一区二区三区99 | 欧美高清一级片 | 91情侣在线偷精品国产 | 成年免费大片黄在线观看岛国 | av电影直播 | 免费激情网址 | 91久久精品一 | 成人激情综合网 | 99国产精品国产免费观看 | 国产精品免费久久久 | 91看片片| 久久91精品国产91久久yfo | 日韩深夜视频 | 久久色网站 | 亚洲成人第一区 | 日本成人一区二区三区 | 亚洲国产精品一区 | 国产三级国产精品国产普男人 | 国产91久久久 | 黄色羞羞视频在线观看 | 久久精品亚洲欧美日韩精品中文字幕 | 一区二区三区四区高清视频 | 97超碰资源站| 久草网在线| 免费黄色成人 | 99成人在线 | 91 免费看片 | a级高清免费毛片av在线 | 国产精品一区在线看 | 亚洲免费在线视频 | av视在线 | av在线免费观看国产 | 99re热视频这里只精品 | 精品国产乱码久久久久久久 | 特一级黄色毛片 | 男女视频免费看 |