Java中 Spring @Pointcut("@annotation(...)") 怎么配置方法级别的自定义注解切点
作者:WeekendLife
时间:2026-07-15
来源:正软商城
浏览:1
SpringAOP中,使用@Pointcut("@annotation(全限定类名)")可精准拦截方法级注解。自定义注解需标注@Target(ElementType.METHOD)和@Retention(RetentionPolicy.RUNTIME),切点表达式填入全限定类名,切面类添加@Component和@Aspect,即可实现AOP拦截。
### 使用 `@Pointcut("@annotation(全限定类名)")` 精准拦截方法级注解
先说一个核心要点:直接使用 `@Pointcut("@annotation(全限定类名)")` 就能精准拦截加了该注解的方法。关键在于,注解定义、切面写法以及包路径设置三个方面,都绝对不能出错。
*(此处为原文提供的图片,说明配置方法级别自定义注解切点的效果)*
### 注解定义必须带上正确的元注解
自定义注解如果想让 AOP 识别,必须明确声明它的作用范围和生命周期,否则根本不会被 AOP 机制捕获到。具体需要留意以下几点:
- `@Target(ElementType.METHOD)`:告诉这个注解只能标注在方法上。如果还想支持类级别的注解,可以加上 `ElementType.TYPE`。
- `@Retention(RetentionPolicy.RUNTIME)`:这个必须是运行时保留。Spring AOP 在运行期要靠反射来读取注解信息,如果生命周期设错了,拦截就会落空。
- `@Documented`(可选):主要是给生成 Ja vaDoc 用的,对 AOP 没有影响。
- `@Inherited`(一般不用):注解本身不会继承给子类,AOP 也不依赖它。
来看一个典型的自定义注解定义:
```ja va
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Log {
String value() default "";
}
```
### 切点表达式的写法必须精确
使用 `@annotation` 切点时,括号里填的一定是注解的**全限定类名**,也就是包路径加类名,而不是简单的类名。这一点非常关键,弄错了就会匹配不上。
- ✅ 正确写法:`@Pointcut("@annotation(cn.zhy.annotation.Log)")`
- ❌ 错误写法:`@Pointcut("@annotation(Log)")` 或者 `@Pointcut("@annotation(log)")`
这个表达式只认被 `@Log` 这个注解明确标记过的方法,不管这个方法是在 Controller、Service 还是普通工具类里面,它都认。但如果是类上的注解间接导致方法被拦截,这种场景就照顾不到了。
### 切面类必须启用并正确引用通知
切面类本身需要被 Spring 管理,通知方法也要正确引用切点方法名。这里有几个细节需要注意:
- 给类加上 `@Component` 和 `@Aspect` 注解,这样 Spring 才能把它当成一个切面来管理。
- `@Pointcut` 方法建议用 `private` 修饰,它只是一个表达式的载体,不需要也不执行具体的业务逻辑。
- 通知方法(比如 `@Before`、`@After` 等)中直接写切点方法名即可,比如 `"logPointcut()"`,没必要再重复写一遍表达式。
示例代码:
```ja va
@Component
@Aspect
public class LogAspect {
@Pointcut("@annotation(cn.zhy.annotation.Log)")
private void logPointcut() {}
@Before("logPointcut()")
public void doBefore(JoinPoint joinPoint) {
System.out.println("方法 " + joinPoint.getSignature().getName() + " 开始执行");
}
}
```
### 实际使用时只需要在目标方法上加注解
一旦配置完成,实际使用时非常简单——在需要被拦截的方法上直接标注 `@Log` 注解。无论是 Controller、Service 还是 Utils 类里的方法,都会被自动拦截。
```ja va
@RestController
public class UserController {
@Log("用户查询操作")
@GetMapping("/user/{id}")
public User getById(@PathVariable Long id) {
return userService.findById(id);
}
}
```
启动应用后调用该接口,控制台会打印出前置日志。整个过程不需要修改方法签名,也不需要在业务代码中嵌入任何侵入性的逻辑。
总而言之,配置过程并不复杂,但注解的定义、切点表达式中的全限定类名、以及切面类的正确启用,这三个环节任何一个出错都会导致拦截失败。只要把握住这几个关键点,就能轻松实现方法级别的自定义注解切点。
本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
github配置ssh key windows
本文详解如何在Windows环境中使用PowerShell生成SSH密钥对,配置ssh-agent自动加载私钥,并将公钥安全添加至GitHub账户,最后通过git remote set-url切换为SSH地址,解决每次操作需输入账号密码的问题。
backdrop和background区别
深入解析backdrop与background在网页开发及视觉设计中的区别。通过CSS代码示例,展示如何正确使用background设置元素背景,以及利用backdrop-filter创建弹窗遮罩模糊效果,避免概念混用。
ServBay安装配置详细教程与操作指南
新手入门 ServBay 本地开发环境,详解安装包下载、Dashboard 状态监控、Packages 组件安装、Services 服务控制及 Websites 项目配置。掌握 .servbay.config 版本管理与日志排查技巧,快速搭建稳定的 PHP、Node.js 等多语言开发环境。
NativeRest环境配置要求与完整操作教程
学习如何配置 NativeRest REST API 客户端。涵盖 Windows/macOS/Linux 安装后的工作区创建、环境变量管理、请求编辑及响应查看步骤,帮助开发者快速完成基础环境搭建与连通性测试。
查看更多