详解SpringBoot AOP 拦截器(Aspect注解方式)

发布时间 - 2026-01-11 01:06:40    点击率:

常用用于实现拦截的有:Filter、HandlerInterceptor、MethodInterceptor

第一种Filter属于Servlet提供的,后两者是spring提供的,HandlerInterceptor属于Spring MVC项目提供的,用来拦截请求,在MethodInterceptor之前执行。

实现一个HandlerInterceptor可以实现接口HandlerInterceptor,也可以继承HandlerInterceptorAdapter类,两种方法一样。这个不在本文范围,具体使用之前已经写过SpringBoot的(SpringMVC的使用一样,区别只是配置)

MethodInterceptor是AOP项目中的拦截器,它拦截的目标是方法,即使不是Controller中的方法。

实现MethodInterceptor拦截器大致也分为两种,一种是实现MethodInterceptor接口,另一种利用Aspect的注解或配置。

关于实现MethodInterceptor接口的这种方法,还需要在配置文件中做配置,在SpringMVC中使用还可以,在SpringBoot中使用起来似乎没有那么方便。

本文主要还是说Aspect注解方式,个人觉得这种方法才比较灵活,与配置与工程整个代码都没有耦合(你添加一个类,做几个注解就可以用了,无需在其他地方再做什么),更易应用。

首先为你的SpringBoot项目添加maven依赖,让其支持aop(其实就是自动引入aop需要的一些jar)

在pom.xml中添加依赖:

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

然后创建Aspect测试类:

package com.shanhy.sboot.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

@Aspect // FOR AOP
@Order(-99) // 控制多个Aspect的执行顺序,越小越先执行
@Component
public class TestAspect {

 @Before("@annotation(test)")// 拦截被TestAnnotation注解的方法;如果你需要拦截指定package指定规则名称的方法,可以使用表达式execution(...),具体百度一下资料一大堆
 public void beforeTest(JoinPoint point, TestAnnotation test) throws Throwable {
  System.out.println("beforeTest:" + test.name());
 }

 @After("@annotation(test)")
 public void afterTest(JoinPoint point, TestAnnotation test) {
  System.out.println("afterTest:" + test.name());
 }

}

这样就完成了,然后创建一个Controller验证一下:

@RestController
@RequestMapping("/test")
public class TestController {

 @TestAnnotation(name="abc")
 @RequestMapping("/show")
 public String show() {
  return "OK";
 }

 @RequestMapping("/show2")
 public String show2() {
  return "OK2";
 }
}

此时我们访问show请求,就会被拦截,控制台会打印输出。如果请求show2则不会被拦截。

注意:

1、在application.properties中也不需要添加spring.aop.auto=true,因为这个默认就是true,值为true就是启用@EnableAspectJAutoProxy注解了。

2、你不需要手工添加 @EnableAspectJAutoProxy 注解。

3、当你需要使用CGLIB来实现AOP的时候,需要配置spring.aop.proxy-target-class=true,这个默认值是false,不然默认使用的是标准Java的实现。

其实aspectj的拦截器会被解析成AOP中的advice,最终被适配成MethodInterceptor,这些都是Spring自动完成的,如果你有兴趣,详细的过程请参考springAOP的实现。

关于集中拦截方法的区别总结:

HandlerInterceptoer拦截的是请求地址,所以针对请求地址做一些验证、预处理等操作比较合适。当你需要统计请求的响应时间时MethodInterceptor将不太容易做到,因为它可能跨越很多方法或者只涉及到已经定义好的方法中一部分代码。

MethodInterceptor利用的是AOP的实现机制,在本文中只说明了使用方式,关于原理和机制方面介绍的比较少,因为要说清楚这些需要讲出AOP的相当一部分内容。在对一些普通的方法上的拦截HandlerInterceptoer就无能为力了,这时候只能利用AOP的MethodInterceptor。

Filter是Servlet规范规定的,不属于spring框架,也是用于请求的拦截。但是它适合更粗粒度的拦截,在请求前后做一些编解码处理、日志记录等。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# spring  # boot  # aspect  # SpringBoot  # aop  # 拦截注解  # spring boot如何通过自定义注解和AOP拦截指定的请求  # Springboot中使用Redisson+AOP+自定义注解实现访问限流与黑名单拦截  # SpringBoot中利用AOP和拦截器实现自定义注解  # spring 重复注解和aop拦截的实现示例  # SpringAop拦截参数带注解的方法  # 的是  # 如果你  # 两种  # 当你  # 拦截器  # 几个  # 就会  # 这种方法  # 还可以  # 多个  # 不太  # 不需要  # 你不  # 要在  # 用了  # 有兴趣  # 是说  # 因为它  # 可以使用  # 在对 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】  Laravel storage目录权限问题_Laravel文件写入权限设置  Laravel如何创建自定义中间件?(Middleware代码示例)  Swift中循环语句中的转移语句 break 和 continue  简单实现Android文件上传  Laravel项目怎么部署到Linux_Laravel Nginx配置详解  如何在建站之星网店版论坛获取技术支持?  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  如何在自有机房高效搭建专业网站?  Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)  简历没回改:利用AI润色让你的文字更专业  PythonWeb开发入门教程_Flask快速构建Web应用  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  海南网站制作公司有哪些,海口网是哪家的?  Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案  Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】  Laravel如何创建自定义Artisan命令?(代码示例)  Laravel怎么上传文件_Laravel图片上传及存储配置  动图在线制作网站有哪些,滑动动图图集怎么做?  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  如何在云主机快速搭建网站站点?  Laravel Octane如何提升性能_使用Laravel Octane加速你的应用  中国移动官方网站首页入口 中国移动官网网页登录  米侠浏览器网页图片不显示怎么办 米侠图片加载修复  如何为不同团队 ID 动态生成多个非值班状态按钮  Laravel如何发送系统通知?(Notification渠道示例)  QQ浏览器网页版登录入口 个人中心在线进入  网站制作报价单模板图片,小松挖机官方网站报价?  Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  清除minerd进程的简单方法  Laravel如何创建自定义Facades?(详细步骤)  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  如何在阿里云香港服务器快速搭建网站?  Python自动化办公教程_ExcelWordPDF批量处理案例  详解Android——蓝牙技术 带你实现终端间数据传输  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】  如何快速查询域名建站关键信息?  Win11怎么开启自动HDR画质_Windows11显示设置HDR选项  如何在云主机上快速搭建多站点网站?  Python面向对象测试方法_mock解析【教程】  Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用  如何在IIS中新建站点并解决端口绑定冲突?  ,交易猫的商品怎么发布到网站上去?  如何使用 jQuery 正确渲染 Instagram 风格的标签列表  JS中对数组元素进行增删改移的方法总结  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出  如何在万网自助建站平台快速创建网站?