目录
一、切入点表达式概述
1、基本概念
切入点表达式用于描述哪些方法是通知要作用的目标方法。在 AOP 开发中,切入点表达式不可或缺。
2、主要形式
-
execution 表达式:通过方法签名进行匹配(本篇重点)
-
注解型表达式:通过方法上的注解进行匹配(后续文章讲解)
二、execution 表达式语法与用法
1、基本语法结构
execution([修饰符] 返回值类型 包名.类名.方法名(参数) throws 异常)
2、省略项说明
2.1 可省略部分
-
方法修饰符(如 public)
-
包名和类名(不建议省略)
-
异常声明(如 throws,注意是方法上声明抛出的异常,不是实际抛出的异常)
2.2 实践建议
-
通常省略修饰符和异常声明
-
包名类名建议保留,避免匹配范围过大导致效率下降
三、表达式实例与演示
1、单方法匹配
使用完整签名精确匹配一个方法,例如:
execution(* com.example.service.impl.DemoService.save(com.example.domain.User))
2、参数匹配
-
(String):一个 String 类型参数 -
(..):任意类型任意数量参数 -
(String, ..):以 String 开头的多个参数
3、省略修饰符和类名的匹配示例
-
省略修饰符:
execution(* com.example..*.save(..))
-
省略包名、类名(不推荐):
execution(* save(..))
四、通配符详解
1、* 通配符
1.1 作用
-
匹配一个单独任意字符(如方法名、类名、返回值等)
1.2 示例
execution(* *Service.*(..))
2、.. 通配符
2.1 作用
-
匹配任意数量、任意类型的参数
-
匹配任意层级的包结构
2.2 示例
-
任意层级包:
execution(* com..*.save(..))
-
任意参数:
execution(* save(..))
五、组合表达式
1、或(||)组合
可匹配多个不同的方法:
execution(* list(..)) || execution(* save(..))
2、匹配多个目标
-
组合方式可用于同时匹配
list()和save(String)等多个方法
六、书写建议与总结
1、书写建议
1.1 方法名规范
-
建议:查询以
find开头、更新以update开头等,方便统一匹配
1.2 基于接口而非实现类
-
利于扩展,实现变更不影响表达式匹配
1.3 缩小匹配范围
-
避免使用
..匹配所有包层级 -
包名、类名不建议省略
2、总结
-
execution 表达式功能强大,语法灵活
-
注意控制匹配粒度,以保证性能
-
通配符
*与..是常用关键要素
END
学习自:黑马程序员——JavaWeb课程
1054

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



