写点什么

Spring webflux 注解:提供全面的 JPA 注解应用案例 (必须收藏)

作者:肖哥弹架构
  • 2024-09-11
    河北
  • 本文字数:3185 字

    阅读完需:约 10 分钟

Spring  webflux注解:提供全面的JPA注解应用案例(必须收藏)

Spring WebFlux,Spring 生态中的响应式 Web 框架,通过其独特的非阻塞 I/O 模型,引领了 Java Web 开发新潮流。它利用@EnableWebFlux注解激活响应式编程模式,结合@RestController@RequestMapping注解,为开发人员提供了构建异步、事件驱动 Web 应用的能力。Spring WebFlux 背后的Project Reactor库,通过FluxMono这样的响应式类型,简化了异步数据流的管理。此外,它还支持@MessageMapping@SendTo注解,方便 WebSocket 通信。@ControllerAdvice@ExceptionHandler注解则为全局异常处理提供了强大支持。Spring WebFlux 的这些注解和功能,共同构成了一个强大而灵活的响应式编程平台,为开发高性能 Web 应用提供了坚实基础。


肖哥弹架构 跟大家“弹弹” 框架注解使用,需要代码关注

欢迎 点赞,关注,评论。

关注公号 Solomon 肖哥弹架构获取更多精彩内容

历史热点文章

1、webFlux 架构关系


  • Spring Web 是基础模块,为 Spring MVC 和 Spring WebFlux 提供基础 Web 功能。

  • Spring MVC 是 Spring Web 的一个子模块,使用 Servlet API,基于注解,适用于传统的 Web 应用程序。

  • Spring WebFlux 也基于 Spring Web,但它使用 Reactive Streams,支持异步非阻塞,适用于需要处理高并发的响应式应用程序。

  • Spring MVC 和 Spring WebFlux 分别指向了不同类型的应用程序,表明了它们的适用场景。

2、WebFlux 架构图


  • 客户端通过 Web 服务器发送请求。

  • Web 服务器将请求传递给处理器函数进行业务逻辑处理。

  • 处理器函数可能需要调用其他服务或数据库。

  • 处理结果通过发布者模型返回给 Web 服务器。

  • Web 服务器将结果发送回客户端。

WebFlux 核心组件包括:

  • DispatcherHandler:中央处理器,用于请求的路由和处理。

  • HandlerMapping:将请求映射到相应的处理器。

  • HandlerAdapter:调用具体的处理器方法。

  • WebHandler:处理程序的顶级接口。

  • HttpHandler:适配不同的 HTTP 服务容器 API。

  • WebFilter:提供 Web 请求的过滤功能。

  • ServerCodecConfigurer:配置编解码器。

3、启动 WebFlux

@EnableWebFlux

  • 注解作用介绍


@EnableWebFlux 注解用于在 Spring 应用中启用 WebFlux 功能,它是响应式编程的配置标记,表明该应用将使用 WebFlux 作为其 Web 请求处理的基础。


  • 注解属性介绍


此注解没有属性,它作为一个开关来激活 WebFlux 特定的自动配置。


  • 注解业务案例


import org.springframework.context.annotation.Configuration;import org.springframework.web.reactive.config.EnableWebFlux;
@Configuration@EnableWebFluxpublic class WebFluxConfig { // 在这里可以添加WebFlux特定的配置,例如定义RouterFunctions或自定义过滤器}
复制代码

4、WebFlux 应用案例

启动响应式 Web 应用程序

  • 业务介绍: Spring WebFlux 允许通过 @EnableWebFlux 注解来创建响应式 Web 应用程序。此注解激活响应式编程支持,并配置应用程序使用 Netty 作为其服务器。

  • 代码实现:


import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.boot.web.embedded.netty.reactor.NettyReactiveWebServerFactory;import org.springframework.context.annotation.Bean;import org.springframework.web.reactive.config.EnableWebFlux;
@SpringBootApplication@EnableWebFluxpublic class ReactiveApplication {
public static void main(String[] args) { SpringApplication.run(ReactiveApplication.class, args); }
@Bean public NettyReactiveWebServerFactory nettyFactory() { return new NettyReactiveWebServerFactory(8080); // 指定端口 }}
复制代码

定义响应式控制器

  • 业务介绍: 使用 @RestController@RequestMapping 注解定义响应式控制器,处理 HTTP 请求并返回响应式结果。

  • 代码实现:


import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RestController;import reactor.core.publisher.Mono;
@RestControllerpublic class HelloController {
@GetMapping("/hello/{name}") public Mono<String> sayHello(@PathVariable String name) { return Mono.just("Hello " + name); }}
复制代码

配置响应式数据库访问

  • 业务介绍: Spring WebFlux 支持响应式数据库访问,使用 R2DBC 作为其数据库连接池和客户端。

  • 代码实现:


@Configurationpublic class DatabaseConfig {
@Bean publicConnectionFactory connectionFactory() { // 创建 R2DBC 连接工厂 }
@Bean public R2dbcEntityTemplate template(ConnectionFactory connectionFactory) { return new R2dbcEntityTemplate(connectionFactory); }}
复制代码

实现响应式服务

  • 业务介绍: 服务层可以实现为响应式,以便非阻塞地处理业务逻辑,例如用户验证、订单处理等。

  • 代码实现:


@Servicepublic class UserService {
@Autowired private UserRepository userRepository;
public Mono<User> findUserById(String id) { return userRepository.findById(id); }}
复制代码

响应式数据访问层

  • 业务介绍: 使用响应式仓库接口,如 ReactiveCrudRepository,实现非阻塞的数据访问。

  • 代码实现:


public interface UserRepository extends ReactiveCrudRepository<User, Long> {    Mono<User> findByEmail(String email);}
复制代码

全局异常处理

  • 业务介绍: 通过 @ControllerAdvice 注解类捕获和处理整个应用程序的异常。

  • 代码实现:


@ControllerAdvicepublic class GlobalExceptionHandler {
@ExceptionHandler(ResourceNotFoundException.class) public Mono<ServerResponse> handleResourceNotFound(ResourceNotFoundException ex) { return ServerResponse.notFound().body(from(ex.getMessage())); }}
复制代码

响应式 WebClient

  • 业务介绍: 使用 WebClient 发起异步的 HTTP 请求,与外部服务或资源进行通信。

  • 代码实现:


@Servicepublic class ExternalServiceClient {
private final WebClient webClient = WebClient.create();
public Mono<ExternalData> fetchExternalData(String url) { return webClient.get() .uri(url) .retrieve() .bodyToMono(ExternalData.class); }}
复制代码

WebSocket 消息处理

  • 业务介绍: 使用 @Controller@MessageMapping 注解处理 WebSocket 消息。

  • 代码实现:


@Controllerpublic class WebSocketController {
@Autowired private SimpMessagingTemplate messagingTemplate;
@MessageMapping("/greeting") public Mono<String> handleGreetingMessage(String message) { return Mono.just("Hello " + message); }
@GetMapping("/ws/greeting") public String handleWebSocketPath() { // 配置 WebSocket 路由 }}
复制代码

服务器发送事件(SSE)

  • 业务介绍: 通过 @RestControllerSseEmitter 实现服务器发送事件,用于推送实时更新到客户端。

  • 代码实现:


@RestControllerpublic class SseController {
@GetMapping("/events") public SseEmitter streamEvents() { SseEmitter emitter = new SseEmitter(); // 配置并发送事件 return emitter; }}
复制代码


发布于: 刚刚阅读数: 2
用户头像

智慧属心窍之锁 2019-05-27 加入

擅长于通信协议、微服务架构、框架设计、消息队列、服务治理、PAAS、SAAS、ACE\ACP、大模型

评论

发布
暂无评论
Spring  webflux注解:提供全面的JPA注解应用案例(必须收藏)_spring_肖哥弹架构_InfoQ写作社区