请不要自己写,Spring Boot非常实用的内置功能

在 Spring Boot 框架中,内置了许多实用的功能,这些功能可以帮助开发者高效地开发和维护应用程序。

一 请求数据记录

Spring Boot提供了一个内置的日志记录解决方案,通过 AbstractRequestLoggingFilter 可以记录请求的详细信息。

AbstractRequestLoggingFilter 有两个不同的实现类,我们常用的是 CommonsRequestLoggingFilter。

通过 CommonsRequestLoggingFilter 开发者可以自定义记录请求的参数、请求体、请求头和客户端信息。

启用方式很简单,加个配置就行了:

@Configuration public class RequestLoggingConfig { @Bean public CommonsRequestLoggingFilter logFilter() { CommonsRequestLoggingFilter filter = new CommonsRequestLoggingFilter(); filter.setIncludeQueryString(true); filter.setIncludePayload(true); filter.setIncludeHeaders(true); filter.setIncludeClientInfo(true); filter.setAfterMessagePrefix("REQUEST DATA-"); return filter; } }

接下来需要配置日志级别为 DEBUG,就可以详细记录请求信息:

logging.level.org.springframework.web.filter.CommonsRequestLoggingFilter=DEBUG

二 请求/响应包装器

2.1 什么是请求和响应包装器

在 Spring Boot 中,请求和响应包装器是用于增强原生 HttpServletRequest 和 HttpServletResponse 对象的功能。这些包装器允许开发者在请求处理过程中拦截和修改请求和响应数据,从而实现一些特定的功能,如请求内容的缓存、修改、日志记录,以及响应内容的修改和增强。

请求包装器

  • ContentCachingRequestWrapper:这是 Spring 提供的一个请求包装器,用于缓存请求的输入流。它允许多次读取请求体,这在需要多次处理请求数据(如日志记录和业务处理)时非常有用。

响应包装器

  • ContentCachingResponseWrapper:这是 Spring 提供的一个响应包装器,用于缓存响应的输出流。它允许开发者在响应提交给客户端之前修改响应体,这在需要对响应内容进行后处理(如添加额外的头部信息、修改响应体)时非常有用。

2.2 使用场景

  1. 请求日志记录:在处理请求之前和之后记录请求的详细信息,包括请求头、请求参数和请求体。
  2. 修改请求数据:在请求到达控制器之前修改请求数据,例如添加或修改请求头。
  3. 响应内容修改:在响应发送给客户端之前修改响应内容,例如添加或修改响应头,或者对响应体进行签名。
  4. 性能测试:通过缓存请求和响应数据,可以进行性能测试,而不影响实际的网络 I/O 操作。

2.3 具体用法

请求包装器的使用

import org.springframework.web.filter.OncePerRequestFilter; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @Component public class RequestWrapperFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { ContentCachingRequestWrapper requestWrapper = new ContentCachingRequestWrapper(request); // 可以在这里处理请求数据 byte[] body = requestWrapper.getContentAsByteArray(); // 处理body,例如记录日志 //。。。 filterChain.doFilter(requestWrapper, response); } }

响应包装器的使用

import org.springframework.web.filter.OncePerRequestFilter; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @Component public class ResponseWrapperFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { ContentCachingResponseWrapper responseWrapper = new ContentCachingResponseWrapper(response); filterChain.doFilter(request, responseWrapper); // 可以在这里处理响应数据 byte[] body = responseWrapper.getContentAsByteArray(); // 处理body,例如添加签名 responseWrapper.setHeader("X-Signature", "some-signature"); // 必须调用此方法以将响应数据发送到客户端 responseWrapper.copyBodyToResponse(); } }

在上面的案例中,OncePerRequestFilter 确保过滤器在一次请求的生命周期中只被调用一次,这对于处理请求和响应数据尤为重要,因为它避免了在请求转发或包含时重复处理数据。

通过使用请求和响应包装器,开发者可以在不改变原有业务逻辑的情况下,灵活地添加或修改请求和响应的处理逻辑。

三 单次过滤器

3.1 OncePerRequestFilter

OncePerRequestFilter 是 Spring 框架提供的一个过滤器基类,它继承自 Filter 接口。这个过滤器具有以下特点:

  1. 单次执行:OncePerRequestFilter 确保在一次请求的生命周期内,无论请求如何转发(forwarding)或包含(including),过滤器逻辑只执行一次。这对于避免重复处理请求或响应非常有用。
  2. 内置支持:它内置了对请求和响应包装器的支持,使得开发者可以方便地对请求和响应进行包装和处理。
  3. 简化代码:通过继承 OncePerRequestFilter,开发者可以减少重复代码,因为过滤器的执行逻辑已经由基类管理。
  4. 易于扩展:开发者可以通过重写 doFilterInternal 方法来实现自己的过滤逻辑,而不需要关心过滤器的注册和执行次数。

3.2 OncePerRequestFilter 使用场景

  1. 请求日志记录:在请求处理之前和之后记录请求的详细信息,如请求头、请求参数和请求体,而不希望在请求转发时重复记录。
  2. 请求数据修改:在请求到达控制器之前,对请求数据进行预处理或修改,例如添加或修改请求头,而不希望这些修改在请求转发时被重复应用。
  3. 响应数据修改:在响应发送给客户端之前,对响应数据进行后处理或修改,例如添加或修改响应头,而不希望这些修改在请求包含时被重复应用。
  4. 安全控制:实现安全控制逻辑,如身份验证、授权检查等,确保这些逻辑在一次请求的生命周期内只执行一次。
  5. 请求和响应的包装:使用 ContentCachingRequestWrapper 和 ContentCachingResponseWrapper 等包装器来缓存请求和响应数据,以便在请求处理过程中多次读取或修改数据
  6. 性能监控:在请求处理前后进行性能监控,如记录处理时间,而不希望这些监控逻辑在请求转发时被重复执行。
  7. 异常处理:在请求处理过程中捕获和处理异常,确保异常处理逻辑只执行一次,即使请求被转发到其他处理器。

通过使用 OncePerRequestFilter,开发者可以确保过滤器逻辑在一次请求的生命周期内只执行一次,从而避免重复处理和潜在的性能问题。这使得 OncePerRequestFilter 成为处理复杂请求和响应逻辑时的一个非常有用的工具。

OncePerRequestFilter 的具体用法松哥就不举例了,第二小节已经介绍过了

四 AOP 三件套

在 Spring 框架中,AOP(面向切面编程)是一个强大的功能,它允许开发者在不修改源代码的情况下,对程序的特定部分进行横向切入。AopContext、AopUtils 和 ReflectionUtils 是 Spring AOP 中提供的几个实用类。

我们一起来看下。

4.1 AopContext

AopContext 是 Spring 框架中的一个类,它提供了对当前 AOP 代理对象的访问,以及对目标对象的引用。

AopContext 主要用于获取当前代理对象的相关信息,以及在 AOP 代理中进行一些特定的操作。

常见方法有两个:

  • getTargetObject(): 获取当前代理的目标对象。
  • currentProxy(): 获取当前的代理对象。

其中第二个方法,在防止同一个类中注解失效的时候,可以通过该方法获取当前类的代理对象。

举个栗子:

public void noTransactionTask(String keyword){ // 注意这里 调用了代理类的方法 ((YourClass) AopContext.currentProxy()).transactionTask(keyword); } @Transactional void transactionTask(String keyword) { try { Thread.sleep(5000); } catch (InterruptedException e) { //logger //error tracking } System.out.println(keyword); }

同一个类中两个方法,noTransactionTask 方法调用 transactionTask 方法,为了使事务注解不失效,就可以使用 AopContext.currentProxy() 去获取当前代理对象。

4.2 AopUtils

AopUtils 提供了一些静态方法来处理与 AOP 相关的操作,如获取代理对象、获取目标对象、判断代理类型等。

常见方法有三个:

  • getTargetObject(): 从代理对象中获取目标对象。
  • isJdkDynamicProxy(Object obj): 判断是否是 JDK 动态代理。
  • isCglibProxy(Object obj): 判断是否是 CGLIB 代理。

举个栗子:

import org.springframework.aop.framework.AopProxyUtils; import org.springframework.aop.support.AopUtils; public class AopUtilsExample { public static void main(String[] args) { MyService myService = ... // 假设 myService 已经被代理 if (AopUtils.isCglibProxy(myService)) { System.out.println("这是一个 CGLIB 代理对象"); } } }

4.3 ReflectionUtils

ReflectionUtils 提供了一系列反射操作的便捷方法,如设置字段值、获取字段值、调用方法等。这些方法封装了 Java 反射 API 的复杂性,使得反射操作更加简单和安全。

常见方法:

  • makeAccessible(Field field): 使私有字段可访问。
  • getField(Field field, Object target): 获取对象的字段值。
  • invokeMethod(Method method, Object target, Object... args): 调用对象的方法。

举个栗子:

import org.springframework.util.ReflectionUtils; import java.lang.reflect.Field; import java.util.Map; public class ReflectionUtilsExample { public static void main(String[] args) throws Exception { ExampleBean bean = new ExampleBean(); bean.setMapAttribute(new HashMap<>()); Field field = ReflectionUtils.findField(ExampleBean.class, "mapAttribute"); ReflectionUtils.makeAccessible(field); Object value = ReflectionUtils.getField(field, bean); System.out.println(value); } static class ExampleBean { private Map<String, String> mapAttribute; public void setMapAttribute(Map<String, String> mapAttribute) { this.mapAttribute = mapAttribute; } } }

还有哪些实用内置类呢?欢迎小伙伴们留言~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1144572.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

轻量级情感分析服务:StructBERT性能优化指南

轻量级情感分析服务&#xff1a;StructBERT性能优化指南 1. 中文情感分析的技术背景与挑战 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;情感分析是理解用户反馈、舆情监控、产品评价等场景的核心技术之一。尤其在中文语境下&#xff0c;由于语言结构复杂、表…

中文评论情感分析进阶:StructBERT高级技巧

中文评论情感分析进阶&#xff1a;StructBERT高级技巧 1. 引言&#xff1a;中文情感分析的现实挑战与技术演进 在电商、社交平台、舆情监控等场景中&#xff0c;中文评论情感分析已成为企业洞察用户情绪、优化产品服务的关键技术。相比英文文本&#xff0c;中文语言具有更强的…

中央空调水系统变频水泵控制程序,包含200smart源程序及smart触摸屏程序,真实项目案例...

中央空调水系统变频水泵控制程序&#xff0c;包含200smart源程序及smart触摸屏程序&#xff0c;真实项目案例未删减&#xff0c;内容以附图为准&#xff0c;程序是电子资料中央空调水系统的变频水泵控制是个挺有意思的活儿。去年在杭州某商业综合体项目里&#xff0c;用西门子S…

AI安全运维入门:从日志分析到威胁狩猎完整路径

AI安全运维入门&#xff1a;从日志分析到威胁狩猎完整路径 1. 为什么传统运维需要AI安全技能 想象一下&#xff0c;你是一名负责维护企业IT系统的运维工程师。过去&#xff0c;你的工作主要是确保服务器稳定运行、处理日常故障。但最近&#xff0c;你发现越来越多的安全告警让…

StructBERT轻量级情感分析:企业指南

StructBERT轻量级情感分析&#xff1a;企业指南 1. 中文情感分析的现实需求与挑战 在数字化转型加速的今天&#xff0c;企业每天都在产生和处理海量的中文文本数据——从客户评论、社交媒体反馈到客服对话记录。如何从中快速提取情绪信号&#xff0c;识别用户的真实感受&…

StructBERT实战:构建产品评论情感分析系统完整指南

StructBERT实战&#xff1a;构建产品评论情感分析系统完整指南 1. 引言&#xff1a;中文情感分析的现实需求与挑战 在电商、社交平台和用户反馈系统中&#xff0c;中文情感分析已成为企业洞察用户情绪、优化产品服务的关键技术。每天海量的用户评论、客服对话、社交媒体发言中…

AI智能体持续学习:云端自动化模型迭代系统

AI智能体持续学习&#xff1a;云端自动化模型迭代系统 引言 想象一下&#xff0c;你训练了一个AI模型来识别电商平台的异常交易。上线后效果不错&#xff0c;但三个月后&#xff0c;欺诈分子换了新手法&#xff0c;模型识别准确率开始下降。传统做法是&#xff1a;停服→重新…

演员 - 评论家强化学习方法

摘要&#xff1a;演员-评论家方法是一种结合策略优化与价值评估的强化学习算法。该方法通过演员组件选择动作&#xff0c;评论家组件评估动作价值&#xff0c;利用优势函数实现高效学习。其优势包括样本效率高、收敛快、适用于离散/连续动作空间&#xff0c;但也面临高方差、训…

【26年1月显示器支架臂推荐清单】教父级机械臂选购指南!用好单/双/三屏支架桌面空间大一倍!

【26年1月显示器支架臂推荐清单】教父级机械臂选购指南&#xff01;涵盖NB/AOC/HKC/北弧/松能/微星/戟创/友狮/京东京造等品牌新手必看显示屏支架臂购买攻略&#xff01;序欢迎来到2026年1月显示器支架臂推荐合集&#xff01;我是「ximagine」很多人问桌面改造的第一步该买什么…

中文情感分析保姆级教程:StructBERT轻量版部署详解

中文情感分析保姆级教程&#xff1a;StructBERT轻量版部署详解 1. 引言 1.1 中文情感分析的应用价值 在当今信息爆炸的时代&#xff0c;用户每天在社交媒体、电商平台、评论区等场景中产生海量的中文文本数据。如何从这些非结构化文本中快速提取情绪倾向&#xff0c;成为企业…

中文情感分析轻量解决方案:StructBERT CPU版部署案例

中文情感分析轻量解决方案&#xff1a;StructBERT CPU版部署案例 1. 引言&#xff1a;中文情感分析的现实需求与挑战 在社交媒体、电商评论、用户反馈等场景中&#xff0c;中文情感分析已成为企业洞察用户情绪、优化产品服务的关键技术。传统的情感判断依赖人工阅读与归纳&am…

强化学习中的蒙特卡洛方法

摘要&#xff1a;强化学习中的蒙特卡洛方法通过与环境交互的经验片段进行学习&#xff0c;无需先验知识。该方法通过重复采样估算状态或动作价值&#xff0c;包括在线策略和离线策略两种方式。蒙特卡洛控制算法通过改进动作价值函数优化策略&#xff0c;适用于游戏、机器人及金…

C++真题库之 CCF GESP 2025 年 9 月认证 C++ 3 级试题含正确答案与解析(考级教程与教材)

系列文章 《GESP系列教程之 什么是GESP?(真题合集)》 历年真题 2025 年 12 月 《C++真题库之 CCF GESP 2025 年 12 月认证 C++ 1 级试题含正确答案与解析(考级教程与教材)》 《C++真题库之 CCF GESP 2025 年 12 月认证 C++ 2 级试题含正确答案与解析(考级教程与教材)》…

6.4 Elasticsearch-线程模型:Netty4 transport、search write thread_pool

6.4 Elasticsearch-线程模型&#xff1a;Netty4 transport、search & write thread_pool 6.4.1 总览&#xff1a;三条独立管道 Elasticsearch 7.0 之后彻底移除 transport-nio&#xff0c;统一使用 Netty4 作为网络层。一条 HTTP 请求或节点间 RPC 进入系统后&#xff0c…

StructBERT轻量优化实战:CPU推理加速技巧

StructBERT轻量优化实战&#xff1a;CPU推理加速技巧 1. 背景与挑战&#xff1a;中文情感分析的工程落地难题 在自然语言处理&#xff08;NLP&#xff09;的实际应用中&#xff0c;中文情感分析是企业级服务中最常见的需求之一。无论是电商评论、客服对话还是社交媒体舆情监控…

AI+SIEM整合指南:5步实现智能告警降噪(含镜像)

AISIEM整合指南&#xff1a;5步实现智能告警降噪&#xff08;含镜像&#xff09; 引言&#xff1a;当SIEM遇上AI会擦出什么火花&#xff1f; 每天面对海量安全告警的SOC分析师们&#xff0c;就像在嘈杂的菜市场里试图听清某个特定对话——90%的告警都是误报&#xff0c;但漏掉…

中文情感分析从入门到精通:StructBERT部署全攻略

中文情感分析从入门到精通&#xff1a;StructBERT部署全攻略 1. 引言&#xff1a;中文情感分析的现实价值与技术挑战 在社交媒体、电商评论、客服对话等海量中文文本数据中&#xff0c;用户情绪是企业洞察用户体验、优化产品策略的重要依据。中文情感分析作为自然语言处理&am…

轻量级情感分析服务:StructBERT REST API开发

轻量级情感分析服务&#xff1a;StructBERT REST API开发 1. 引言&#xff1a;中文情感分析的现实需求与挑战 在社交媒体、电商评论、用户反馈等场景中&#xff0c;中文文本的情感倾向蕴含着丰富的业务洞察。然而&#xff0c;由于中文语言结构复杂、语义模糊性强&#xff0c;…

学习周报三十

摘要 本周深入研究了DeepSeek团队提出的新型神经网络架构mHC&#xff08;流形约束超级连接&#xff09;。该工作旨在解决传统超级连接&#xff08;HC&#xff09;在训练超大规模语言模型时引发的数值不稳定&#xff08;“蝴蝶效应”&#xff09;问题。mHC通过对连接矩阵施加“双…

C++真题库之 CCF GESP 2025 年 9 月认证 C++ 4 级试题含正确答案与解析(考级教程与教材)

系列文章 《GESP系列教程之 什么是GESP?(真题合集)》 历年真题 2025 年 12 月 《C++真题库之 CCF GESP 2025 年 12 月认证 C++ 1 级试题含正确答案与解析(考级教程与教材)》 《C++真题库之 CCF GESP 2025 年 12 月认证 C++ 2 级试题含正确答案与解析(考级教程与教材)》…