Spring Boot 非常实用的内置功能减少内部开发

Spring Boot项目通用功能之《通用Mapper》 前言 接下来这几篇文章中我们主要说说,在我们的项目中会使用哪些通用的功能,例如:通用Mapper(mybatis框架的)、通用service和分页功能等等,这些通用功能的使用会大大降低我们的开发时间,也会让我们的代码变得更加有规范更加合理,今天这篇文章我们说说怎么使用通用mapper。 通用mapper简介 通用mapper是一个国人编写的工具jar,它可以极其方便的做单表增删改查(使用 阅读详情

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

  1. 请求数据记录
    Spring Boot提供了一个内置的日志记录解决方案,通过 AbstractRequestLoggingFilter 可以记录请求的详细信息。AbstractRequestLoggingFilter 有两个不同的实现类,我们常用的是 CommonsRequestLoggingFilter

在这里插入图片描述
通过 CommonsRequestLoggingFilter 开发者可以自定义记录请求的参数、请求体、请求头和客户端信息。

Configuration
public class RequestLoggingConfig {
    @Bean
    public CommonsRequestLoggingFilter requestLogFilter() {
        CommonsRequestLoggingFilter filter = new CommonsRequestLoggingFilter();
        filter.setIncludeQueryString(true);
        filter.setIncludePayload(true);
        filter.setIncludeHeaders(true);
        filter.setIncludeClientInfo(true);
        filter.setAfterMessagePrefix("REQUEST-");
        return filter;
    }
}
  • 请求/响应包装器

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

请求包装器
ContentCachingRequestWrapper:这是 Spring 提供的一个请求包装器,用于缓存请求的输入流。它允许多次读取请求体,这在需要多次处理请求数据(如日志记录和业务处理)时非常有用。
响应包装器
ContentCachingResponseWrapper:这是 Spring 提供的一个响应包装器,用于缓存响应的输出流。它允许开发者在响应提交给客户端之前修改响应体,这在需要对响应内容进行后处理(如添加额外的头部信息、修改响应体)时非常有用。
2.2 使用场景
请求日志记录:在处理请求之前和之后记录请求的详细信息,包括请求头、请求参数和请求体。
修改请求数据:在请求到达控制器之前修改请求数据,例如添加或修改请求头。
响应内容修改:在响应发送给客户端之前修改响应内容,例如添加或修改响应头,或者对响应体进行签名。
性能测试:通过缓存请求和响应数据,可以进行性能测试,而不影响实际的网络 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 接口。这个过滤器具有以下特点:

单次执行:OncePerRequestFilter 确保在一次请求的生命周期内,无论请求如何转发(forwarding)或包含(including),过滤器逻辑只执行一次。这对于避免重复处理请求或响应非常有用。

内置支持:它内置了对请求和响应包装器的支持,使得开发者可以方便地对请求和响应进行包装和处理。

简化代码:通过继承 OncePerRequestFilter,开发者可以减少重复代码,因为过滤器的执行逻辑已经由基类管理。

易于扩展:开发者可以通过重写 doFilterInternal 方法来实现自己的过滤逻辑,而不需要关心过滤器的注册和执行次数。

3.2 OncePerRequestFilter 使用场景
请求日志记录:在请求处理之前和之后记录请求的详细信息,如请求头、请求参数和请求体,而不希望在请求转发时重复记录。

请求数据修改:在请求到达控制器之前,对请求数据进行预处理或修改,例如添加或修改请求头,而不希望这些修改在请求转发时被重复应用。

响应数据修改:在响应发送给客户端之前,对响应数据进行后处理或修改,例如添加或修改响应头,而不希望这些修改在请求包含时被重复应用。

安全控制:实现安全控制逻辑,如身份验证、授权检查等,确保这些逻辑在一次请求的生命周期内只执行一次。

请求和响应的包装:使用 ContentCachingRequestWrapper 和 ContentCachingResponseWrapper 等包装器来缓存请求和响应数据,以便在请求处理过程中多次读取或修改数据。

性能监控:在请求处理前后进行性能监控,如记录处理时间,而不希望这些监控逻辑在请求转发时被重复执行。

异常处理:在请求处理过程中捕获和处理异常,确保异常处理逻辑只执行一次,即使请求被转发到其他处理器。

通过使用 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;
        }
    }
}

Spring Boot 有哪些优点 Spring Boot 是一个非常强大且灵活的框架,极大地提升了开发者的开发效率。通过减少配置和简化开发流程,它使得开发者可以更专注于业务逻辑和功能实现。无论是传统的 Web 应用开发,还是基于微服务架构的开发,Spring Boot 都能提供很好的支持。 阅读详情

相关推荐

Java Spring Boot 入门:开启高效开发之旅

Spring Boot 是一个基于 Spring 框架的开源项目,旨在通过自动化配置和内嵌服务器来简化 Spring 应用的初始搭建和开发过程。它提供了大量的开箱即用功能,使得开发者可以更加专注于业务逻辑的实现,从而提高开发效率。通过上述步骤,你已经成功创建了一个简单的 Spring Boot 应用。当然,这只是一个开始,Spring Boot 还有大量的功能等待你去探索。官方文档:阅读 Spring Boot 官方文档(),了解更详细的内容和高级特性。实践练习。

JID007的博客 1515

10个Spring Boot 框架内置的实用功能介绍

Spring Boot 的这些内置功能覆盖了从开发到运维的全链路流程,合理运用这些工具,既能减少重复代码,又能提升系统的可维护性与健壮性。Spring Boot 最显著的生产力提升工具之一是 Starter 依赖体系,通过命名规范清晰的 “一站式” 依赖包,开发者无需手动搜索和匹配兼容版本,框架自动处理传递依赖冲突。在 Spring Boot 开发中,框架内置的诸多实用功能犹如一把把利刃,能让开发者在项目的各个阶段都事半功倍。在调试和监控阶段,记录请求的完整信息是定位问题的关键。

学亮编程手记 1400

Java Spring、Spring MVC、Spring Boot 和 Spring Cloud 的关系与区别

本文详细介绍了 Java 开发中常用的 Spring 系列框架及其关系。Spring 是核心框架,提供控制反转(IoC)和面向切面编程(AOP)等基础功能。Spring MVC 是 Spring 的模块,专注于 Web 开发,采用 MVC 设计模式。Spring Boot 简化了 Spring 应用的初始搭建和开发,提供默认配置和嵌入式服务器。Spring Cloud 基于 Spring Boot,扩展了分布式系统开发的能力,提供服务发现、熔断器等功能。这些框架共同构成了强大的 Java 开发生态系统,满足

C_V_Better的博客 1306

Spring Boot的实用内置功能详解

在Spring Boot中,Controller层负责处理HTTP请求并返回响应。Spring Boot提供了多种方式来定义Controller接口,以满足不同的需求。使用注解是一个组合注解,它结合了和的功能。使用注解的类中的所有方法都会默认返回JSON或XML格式的响应体。这对于实现RESTful API非常有用。使用注解注解用于将HTTP请求映射到特定的处理方法上。它可以定义在类或方法级别上,用于匹配请求的URL、请求方法(如GET、POST等)、请求参数等。通过。

2301_76419561的博客 1984

Spring Boot开发:从入门到精通

想象一下,你正在为一家企业开发一个复杂的应用,在这过程中,不可避免地会遇上繁琐的配置、无休止的依赖管理。Spring Boot犹如一座桥梁,连接了开发者与简洁高效之间的距离。它提供了一系列自动配置功能和起步依赖,帮助你快速搭建起基于Spring的应用。根据Pivotal团队的描述,Spring Boot能够显著减少开发时间,使得应用的构建过程变得简单、友好及高效。正如一位调酒师预先准备好的配料,开发者只需将其组合,即可调制出美味的鸡尾酒。

weixin_44626085的博客 963

Spring Boot电商开发:购物商城系统

对于不同的模块独立的分装起来,在传统测试的时候要进行数据的统一测试,完成对系统的概要设计详细解读资料、需要解决的问题,及操作的详细应用说明等内容来视作测试的突破口,对测试的对象进行逐一对照检查,并针对单个的程序检测延伸至这个研发过程中单个及整个集成单元的检测中,要有规律有顺序的进行,不但可以缩短我们的工作时效,避免返工的操作,也可以对可用性负责,提高了可操作性和软件研发的实用性。通过对系统概要设计验证测试,测试系统的统一管理方式,对系统的各个功能模块以及系统的性能进行测试,验证系统的功能以及系统的性能。

2401_85761762的博客 2201

Spring Boot与Spring框架集成:提升开发效率,减少代码冗余

Spring Boot的出现彻底改变了Spring框架的使用方式,它通过自动配置和简化的开发流程,使得Spring应用的开发变得更加高效和灵活。与Spring MVC、Spring Data、Spring Security等核心组件的无缝集成,帮助开发者减少了大量的配置和冗余代码,使得开发过程更加简洁高效。通过Spring Boot,开发者可以专注于业务逻辑的实现,而不必在繁琐的配置和框架搭建上浪费大量时间。

一碗黄焖鸡三碗米饭的博客 916

如何修复Windows卡在“正在准备Windows”的问题?这里有详细步骤

如何修复Windows卡在“正在准备Windows”的问题?这里有详细步骤。

wyxtx的博客 5657

Java Web开发进阶——Spring Boot与Spring Data JPA

Spring Data JPA 是 Spring Data 项目中的子项目,旨在简化与 JPA(Java Persistence API)的集成。它在标准 JPA 的基础上提供了更高层次的抽象,开发者可以使用极少的代码实现复杂的数据操作。Spring Data JPA 是 Spring 提供的一种面向数据访问的持久化框架,它简化了 JPA 的实现,为开发者提供了一种快速操作数据库的方式。Spring Data JPA 的强大之处在于其灵活的查询方式,支持方法派生、JPQL 和原生 SQL。

好看资源网的博客 2243

用V E S C 6-M K V I 第六代调速控制器给VESC电调刷固件

文章摘要:本文介绍了一款先进的电机控制器,具备多项创新技术。核心亮点包括三相电流/电压检测、四象限无缝运行、多模式兼容等先进电机控制技术,以及智能感知与安全保护、高效能电源管理、多样化连接与扩展功能。此外,该控制器支持实时数据监测与用户交互,具备开源生态和工业级可靠性,适用于电动载具、机器人及工业领域。用户需注意散热要求和兼容性提示,可通过VESC-Tool软件进行灵活配置。产品可在常竹科技淘宝店购买,并加入技术交流群获取支持。

2403_89422757的博客 1364

simulink调用C代码函数-C Caller模块

simulink中如何调用写好的C代码函数?使用C Caller模块调用C代码。

weixin_40531919的博客 5668

Java面试必备:Spring Boot简化Spring应用开发的利器

SpringBoot是一个简化Spring应用程序开发的框架。它的主要目标是减少Spring应用程序的配置和开发复杂性,使我们能够更快地构建、测试和部署Spring 应用。简单来说它通过提供默认配置、自动化配置和嵌入式服务器等功能,简化了传统Spring应用的繁琐配置过程。有人将一些依赖关系、默认配置都梳理好了,我们直接一个引用就搞定了,这就是它的本质。是一个为简化Spring应用程序开发而设计的开源框架。

qq_58299462的博客 1658

STM32 SAES硬件加密协处理器全模式工程实践指南

AES(高级加密标准)是嵌入式系统中最基础且关键的对称密码算法,其硬件加速实现直接影响安全、性能与功耗平衡。Secure AES Coprocessor(SAES)作为STMicroelectronics在STM32U5等高安全MCU中集成的专用密码协处理器,不仅支持标准ECB/CBC/CTR模式,更原生兼容GCM和CCM等认证加密模式,具备抗侧信道、密钥保护与DMA卸载能力。理解其寄存器状态机(CHMOD/MODE/CPHASE)、NPBLB数据对齐机制及GCM四阶段编程范式,是规避Tag校验失败、IV错

weixin_42311427的博客 76

Spring Boot 的 20个实用技巧

每次启动 Spring Boot 应用,看到默认的启动 Banner 是不是觉得有点单调?其实,我们可以自定义这个 Banner,让启动界面充满个性。只需在目录下创建一个banner.txt文件,在里面写入你想要展示的内容,比如公司 logo、项目名称、版本号等。____ _ _ _这样,下次启动应用时,就能看到自定义的 Banner。为我们提供了更多灵活的启动配置方式,通过链式调用,可以在代码层面方便地设置应用的各种属性。.run(args);

风象南的专栏 1085

PINN物理信息网络 | 非线性薛定谔方程的物理信息神经网络

PINN物理信息网络 | 非线性薛定谔方程的物理信息神经网络

算法如诗的博客 1298

智驾芯片新天团!NVIDIA Thor vs 高通8797 vs 蔚来神玑NX9031,2025-2026谁能称王?

应用场景推荐芯片理由高阶NOA + L4 Robotaxi千TOPS以上,满足BEV+TransformerL2+/L3级别NOAThor-U / 高通8797算力适中,功耗控制佳,生态成熟经济型城市NOAThor-Z / S性价比均衡,适合前装普及自研平台一体化NX9031华为之外最强自研整合方案📌 TOPS不再是天花板,GPU、带宽、功耗、上市时间和车企绑定都是决胜关键📌 Thor系列仍然统治高端,但国产神经元开始觉醒📌 智驾芯片的选择,从“强”走向“适合场景”

weixin_43199439的博客 2637

Spring Boot 9大内置神器,助力开发效率翻倍

霸道真气,绝对给力!

码刀攻城 979

AI一键生成带货短视频:电商直播的未来

随着电子商务行业的快速发展,直播带货已成为一种极为有效的营销手段。然而,传统的人工直播方式存在诸多局限性,如人力成本高、主播培训周期长等问题。为了解决这些挑战,一种基于AI技术的一键生成带货视频解决方案应运而生——这就是“Anchor Crafter”。这项创新技术不仅能够自动创建高质量的带货视频,而且还能实现人物与商品之间的自然交互,极大地提升了用户体验。

这里汇聚了前沿的技术分享与实用的开发技巧,带你探索从创意到企业的技术创业之路。 2201

【Spring Boot 】详解

随着 Java 应用的日益复杂,传统 Spring 框架在项目搭建与配置方面愈发繁琐,大量的 XML 配置、依赖管理等工作耗费开发者诸多精力。为解决这些痛点,Spring Boot 应运而生,旨在简化 Spring应用的初始搭建以及开发过程,让开发者能更聚焦于业务逻辑实现。

架构师之路 1269

深度学习实战103-基于KDD Cup 99数据集的搭建神经网络的检测系统(NIDS),通过对网络流量数据进行分析,提供完整代码

接下来,我们定义一个全连接神经网络模型。return x# 创建数据集和数据加载器# 初始化模型通过以上步骤,我们实现了一个基于PyTorch的简单网络入侵检测系统。这个系统使用KDD Cup 99数据集进行训练和评估。实际应用中,您可以根据需求调整模型结构、超参数以及数据预处理方法。希望对大家有所帮助!如果有任何问题或需要进一步的解释,请随时咨询。

微学AI的博客 1582

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

用Maven奏响Spring Boot项目开发乐章

Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。它并不是一个全新的框架,而是对 Spring 的一个封装,你以前能用 Spring 做的事情,现在用 Spring Boot 同样可以做到。从发展历程来看,2013 年 Spring Boot 项目开始研发,旨在简化 Spring 应用的开发流程。

测试工程师成长之路 1408

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

用Maven开发Spring Boot 项目

在Spring体系中,较早实现MVC框架的有Struts-Spring-Hibernate(SSH)框架和Spring-Spring MVC+MyBatis(SSM)框架,为了进一步在保证功能的前提下优化项目的开发流程,Pivotal公司于2014年4 月发布了Spring Boot 的第一个版本,当下该框架已经升级到了3.2.1版本。Spring Boot框架是一 套开源的后台开发框架, 继承了Spring MVC框架的前辈SSM框架的优秀特性,通过注解大幅减少程序员写配置的工作量。

水寿十八公专栏 3909

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Spring Boot应用开发实战:从入门到精通

一、Spring Boot 简介 1.1 什么是 Spring Boot? Spring Boot 是一个开源框架,旨在简化新 Spring 应用的初始搭建以及开发过程。它构建在 Spring 框架之上,利用了 Spring 的核心特性,如依赖注入(Dependency Injection)、面向切面编程(Aspect Oriented Programming)、数据访问(Data Access)等,并通过自动化配置(Auto-configuration)和约定优于配置(Convention

qq_22232065的博客 1600

Java Web开发进阶——Spring Boot基础

Spring Boot 通过简化配置、内置服务器、强大的生态系统,显著提升了 Java 开发效率。Spring Boot是基于Spring框架的新一代开发框架,旨在通过自动化配置和简化的开发方式提升生产效率。Spring Boot 的核心目标是通过“约定优于配置”的理念,减少代码和配置,使开发者能够快速启动一个功能完整的应用程序。Spring Boot 是 Spring 家族中的重要成员,为简化和加速基于 Spring 框架的应用开发而生。Spring Boot 支持灵活的配置方式,通过。

好看资源网的博客 1404
上一篇: EasyExcel的AbstractColumnWidthStyleStrategy注入CellStyle不生效
下一篇: java.util.Date 类存在多个问题当前开发环境不再适用
狂野弘仁
博客等级 码龄8年 34粉丝 81原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值