本文只是簡單使用springboot2使用webflux的函數式編程簡單使用,后續會繼續寫關于webflux相關的文章。
最近一直在研究webflux,后續會陸續出一些相關的文章。
首先看一下srping官網上的一張圖,對比一下springmvc和spring 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" ; } } |
結果如圖:
接下來使用函數式編程,首先查閱一下官方文檔,如圖:
我們需要創建一個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); } } |
啟動項目,通過控制臺可以看到,兩種方式的映射都被打印出來了,如圖所示:
在瀏覽器訪問,http://localhost:8080/hi,結果如圖所示:
源碼下載 :大老楊碼云
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:https://blog.csdn.net/qq_33257527/article/details/81300802