SpringBoot WebFlux 官网文档阅读笔记

版本:2.1.5.RELEASE

章节:29.2 The “Spring WebFlux Framework”

29.2 The “Spring WebFlux Framework”

Spring WebFlux是Spring Framework 5.0中引入的新的响应式Web框架。与Spring MVC不同,它不需要Servlet API,完全异步且无阻塞,并通过Reactor项目实现Reactive Streams规范

Spring WebFlux有两种版本:基于功能和基于注解。

基于注解的这一类型非常接近Spring MVC模型,如以下示例所示:

import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

@RestController
@RequestMapping("/users")
public class MyRestController {

    @GetMapping("/{user}")
    public Mono<User> getUser(@PathVariable Long user) {
        // ...
        return Mono.empty();
    }

    @GetMapping("/{user}/customers")
    public Flux<Customer> getUserCustomers(@PathVariable Long user) {
        // ...
        return Flux.empty();
    }

    @DeleteMapping("/{user}")
    public Mono<User> deleteUser(@PathVariable Long user) {
        // ...
        return Mono.empty();
    }

}

基于功能,将路由配置与请求的实际处理分开,如以下示例所示:

@Configuration
public class RoutingConfiguration {

    @Bean
    public RouterFunction<ServerResponse> monoRouterFunction(UserHandler userHandler) {
        return route(GET("/{user}").and(accept(APPLICATION_JSON)), userHandler::getUser)
                .andRoute(GET("/{user}/customers").and(accept(APPLICATION_JSON)), userHandler::getUserCustomers)
                .andRoute(DELETE("/{user}").and(accept(APPLICATION_JSON)), userHandler::deleteUser);
    }

}

@Component
public class UserHandler {

    public Mono<ServerResponse> getUser(ServerRequest request) {
        // ...
        return Mono.empty();
    }

    public Mono<ServerResponse> getUserCustomers(ServerRequest request) {
        // ...
        return Mono.empty();
    }

    public Mono<ServerResponse> deleteUser(ServerRequest request) {
        // ...
        return Mono.empty();
    }
}

WebFlux是Spring Framework的一部分,详细信息可在其参考文档中找到。

您可以根据需要定义尽可能多的RouterFunction bean来模块化路由器的定义。如果需要应用优先级,可以订购Bean。

首先,将spring-boot-starter-webflux模块添加到您的应用程序中。

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
        </dependency>

在应用程序中同时添加spring-boot-starter-webspring-boot-starter-webflux模块会导致Spring Boot自动配置Spring MVC,而不是WebFlux。选择此行为是因为许多Spring开发人员将spring-boot-starter-webflux添加到他们的Spring MVC应用程序中以使用反应式WebClient。您仍然可以通过将所选应用程序类型设置为SpringApplication.setWebApplicationType(WebApplicationType.REACTIVE)来强制执行您的选择。

29.2.1 Spring WebFlux Auto-configuration

Spring Boot为Spring WebFlux提供自动配置,适用于大多数应用程序。

自动配置在Spring的默认值之上添加了以下功能:

  • 为HttpMessageReader和HttpMessageWriter实例配置编解码器
  • 支持提供静态资源,包括对WebJars的支持

如果你想保留Spring Boot WebFlux功能,并且想要添加额外的WebFlux配置,你可以添加自己的@Configuration类,类型为WebFluxConfigurer,但没有@EnableWebFlux

如果您想完全控制Spring WebFlux,可以添加自己的@Configuration注解并启动@EnableWebFlux

29.2.2 HTTP Codecs with HttpMessageReaders and HttpMessageWriters

Spring WebFlux使用HttpMessageReader和HttpMessageWriter接口来转换HTTP请求和响应。通过查看类路径中可用的库,它们配置了CodecConfigurer以具有合理的默认值。

Spring Boot通过使用CodecCustomizer实例进一步自定义。例如,spring.jackson.*配置键应用于Jackson编解码器。

如果需要添加或自定义编解码器,可以创建自定义CodecCustomizer组件,如以下示例所示:

import org.springframework.boot.web.codec.CodecCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyConfiguration {

    @Bean
    public CodecCustomizer myCodecCustomizer() {
        return codecConfigurer -> {
            // ...
        };
    }
}

您还可以利用Boot的自定义JSON序列化程序和反序列化程序

29.2.3 Static Content

默认情况下,Spring Boot从类路径中名为 /static(或/public或/resources或/META-INF/resources)的目录中提供静态内容。它使用Spring WebFlux中的ResourceWebHandler,以便您可以通过添加自己的WebFluxConfigurer并覆盖addResourceHandlers方法来修改该行为。

默认情况下,资源映射到 /**,但您可以通过设置spring.webflux.static-path-pattern属性来调整它。例如,可以按如下方式将所有资源重新定位到 /resources/**

spring.webflux.static-path-pattern=/resources/**

您还可以使用spring.resources.static-locations自定义静态资源位置。这样做会将默认值替换为目录位置列表。如果这样做,默认的欢迎页面检测将切换到您的自定义位置。因此,如果启动时在任何位置存在index.html,则它是应用程序的主页。

除了前面列出的“标准”静态资源位置之外,还为Webjars内容制作了一个特例。在 /webjars/** 中具有路径的任何资源都是从jar文件提供的,如果它们以Webjars格式打包的话。

Spring WebFlux应用程序并不严格依赖于Servlet API,因此它们不能作为war文件部署,也不能使用 src/main/webapp 目录。

29.2.4 Template Engines

除REST Web服务外,您还可以使用Spring WebFlux来提供动态HTML内容。Spring WebFlux支持各种模板技术,包括ThymeleafFreeMarkerMustache

当您使用其中一个模板引擎和默认配置时,您的模板将自动从 src/main/resources/templates 中获取。

29.2.5 Error Handling

29.2.6 Web Filters

Spring WebFlux提供了一个WebFilter接口,可以实现该接口来过滤HTTP请求 - 响应交换。在应用程序上下文中找到的WebFilter bean将自动用于过滤每个交换。

如果过滤器的顺序很重要,则可以实现Ordered使用@Order进行注解。Spring Boot自动配置可以为您配置Web过滤器。执行此操作时,将使用下表中显示的订单:

Web FilterOrder
MetricsWebFilterOrdered.HIGHEST_PRECEDENCE + 1
WebFilterChainProxy(Spring Security) -100
HttpTraceWebFilterOrdered.LOWEST_PRECEDENCE - 10

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot是一个用于创建独立的、生产级别的基于Java的应用程序的框架。它的特点是简单、快速、方便,适合用于构建单体应用程序。在传统的Spring Boot项目中,前后端通常没有明确的分离,而是将前端代码和后端代码放在同一个项目中。 下面是一些笔记,可以帮助你理解如何在Spring Boot项目中进行前后端不分离的开发: 1. 项目结构:在项目中创建一个统一的目录结构,将前端和后端代码放置在不同的子目录中。可以按照功能或模块来组织代码。 2. 视图层:使用模板引擎(如Thymeleaf)来生成前端页面。在后端代码中编写HTML模板文件,将动态数据注入到模板中,然后将渲染后的HTML页面返回给客户端。 3. 控制器:编写后端的控制器类来处理请求和返回数据。控制器类负责接收前端请求,处理业务逻辑,并将相应的数据返回给前端。 4. 数据交互:使用Spring Boot提供的HTTP请求处理功能来处理前后端之间的数据交互。可以使用@RestController注解标记控制器类,使用@RequestMapping注解标记方法,然后通过方法参数接收请求参数或请求体。 5. 安全性:可以使用Spring Security来保护应用程序的安全性。通过配置安全规则,可以限制访问某些URL或资源的权限。 6. 数据库操作:可以使用Spring Data JPA来进行数据库操作。通过定义实体类和仓库接口,可以方便地进行CRUD操作。 7. 测试:可以使用JUnit或Spring Boot提供的测试框架来编写单元测试和集成测试。通过测试可以确保代码的质量和功能的正确性。 请注意,虽然在前后端不分离的项目中,前端代码和后端代码放在同一个项目中,但仍可以通过组织代码结构和使用合适的技术来实现代码的模块化和可维护性。如果你希望实现前后端分离的开发方式,可以考虑使用前后端分离的框架(如Vue.js、React等)来构建前端,并通过RESTful API来进行数据交互。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值