概述
本系列文章用来分析Spring WebFlux
的工作原理,这是第一篇。在这篇文章中,我们参考Spring
官方教程构建一个基于Spring Boot
的WebFlux
例子应用,用于随后的原理分析。
这里构建例子项目所参考的Spring
教程是:Building a Reactive RESTful Web Service。该文档中提到了使用gradle
,maven
,IDE
三种构架该项目的方式,这里我们采用了maven
这种方式。该项目主要包含如下文件 :
pom.xml
–maven
项目文件practice.webflux.Application
–java
文件,Spring Boot
应用入口程序practice.webflux.GreetingHandler
–java
文件,基于WebFlux
的请求处理组件practice.webflux.GreetingRouter
–java
文件,路由配置,配置URL pattern
和请求处理组件GreetingHandler
的映射关系
编译打包并运行该项目应用 :
mvn clean package
java -jar target\webflux-1.0-SNAPSHOT.jar
效果如下 :
- 应用作为一个
Web
服务启动,使用服务端口8080
; - 通过浏览器访问
http://localhost:8080/hello
得到响应Hello, Spring!
。
该系列文章将基于以上例子,主要分析如下两个过程 :
- 应用程序启动过程
- 请求处理过程
通过以上分析,我们将主要解答以下问题 :
- 路由配置何时被加载 ?
- 请求如何被处理 ?
- 请求参数解析过程是怎样的 ?
- 返回值是如何写入到响应的 ?
例子项目的源代码
1. pom.xml
<?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>practice</groupId>
<artifactId>webflux</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<properties>
<java.version>1.8</java.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2. Application.java
package practice.webflux;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class, args);
}
}
3. GreetingHandler.java
package practice.webflux;
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;
@Component
public class GreetingHandler {
public Mono<ServerResponse> hello(ServerRequest request) {
return ServerResponse.ok().contentType(MediaType.TEXT_PLAIN)
.body(BodyInserters.fromObject("Hello, Spring!"));
}
}
4. GreetingRouter.java
package practice.webflux;
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;
@Configuration
public class GreetingRouter {
@Bean
public RouterFunction<ServerResponse> route(GreetingHandler greetingHandler) {
return RouterFunctions
.route(RequestPredicates.GET("/hello")
.and(RequestPredicates.accept(MediaType.TEXT_PLAIN)), greetingHandler::hello);
}
}
转载:https://blog.csdn.net/andy_zhang2007/article/details/100694160
查看评论