目录
一、基于注解的切入点表达式 @annotation
1、背景回顾
1.1 问题提出
在使用 execution 表达式匹配多个无规律的方法时,组合多个表达式不够方便和灵活。
1.2 解决思路
可使用另一种切入点表达式 —— @annotation 表达式,基于注解来进行方法匹配,从而简化表达式编写。
二、@annotation 表达式的使用步骤
1、自定义注解

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyLog {
}
1.1 创建注解
在 AOPC 包中自定义注解,例如:
public @interface MyLog {}
1.2 注解配置
-
@Retention(RetentionPolicy.RUNTIME):指定注解在运行时生效。 -
@Target(ElementType.METHOD):指定注解只能用于方法上。
注解本身不包含属性,仅作为标识使用。
2、在目标方法上添加注解
在需要被匹配的方法上加上该注解:
@MyLog
public void list() {}
@MyLog
public void delete() {}

3、使用注解表达式定义切入点
在切面中使用注解型切入点表达式:
@Slf4j
@Component
@Aspect
public class MyAspect3 {
@Pointcut("@annotation(com.qiyi.aop.MyLog)")
private void pt(){}
@Before("pt()")
public void before() {
log.info("before... MyLog");
}
}
三、表达式验证与测试
1、运行测试方法
运行加了 @MyLog 注解的方法,观察通知是否执行。

2、验证匹配效果
-
添加注解的方法:通知会执行
-
移除注解的方法:通知不会执行
2.1 匹配控制灵活
只需在方法上添加或移除注解即可控制是否匹配该方法,灵活简洁。
四、总结与对比
1、两种表达式对比
| 表达式类型 | 表达式示例 | 特点 |
|---|---|---|
| execution | execution(* *..*Service.*(..)) | 通过方法签名匹配,常规、广泛使用 |
| @annotation | @annotation(com.example.MyLog) | 通过注解标记方法,灵活、精确 |
2、使用建议
2.1 execution 适用场景
-
方法规则统一,便于通过签名匹配
-
使用频率最高的一种方式
2.2 @annotation 适用场景
-
方法名不规律或需求特殊时
-
execution 难以描述时的补充方案
注解表达式需多定义一个注解,但可获得更高的灵活性和控制力。
END
学习自:黑马程序员——JavaWeb课程
1054

被折叠的 条评论
为什么被折叠?



