Spring AOP 实战指南:从入门到精通(4)
3.5 切点表达式:
上面的代码中,我们一直在使用切点表达式来描述切点。下面我们来介绍一下切点表达式的语法。
切点表达式常见有两种表达方式:
execution:根据方法的签名来匹配。
@annotation:根据注解匹配。
3.5.1 execution 表达式:
execution() 是最常用的切点表达式,用来匹配方法,语法为:
execution (<访问修饰符> <返回类型> <包名.类名.方法(方法参数)> <异常>)
切点表达式支持通配符表达:
* :匹配任意字符,只匹配一个元素(返回类型,包,类名,方法或者方法参数)。
包名使用 * 表示任意包(一层包使用一个 * )。
类名使用 * 表示任意类。
返回值使用 * 表示任意返回值类型。
方法名使用 * 表示任意方法(参数可能有限制)。
参数使用 * 表示一个任意类型的参数。
..:匹配多个连续的任意符号,可以通配任意层级的包,或任意类型,任意个数的参数。
使用..配置包名,标识此包以及此包下的所有子包。
可以使用..配置参数,任意个任意类型的参数。
3.5.2 @annotation:
execution 表达式更适用有规则的,如果我们要匹配多个无规则的方法呢,比如:TestController 中的 t1() 和 UserController 中的 u1() 这两个方法。这个时候我们使用 execution 这种切点表达式来描述就不是很方便了。我们可以借助自定义注解的方式以及另一种切点表达式 @annotation 来描述这一类的切点。
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface MyAspect { }
@Component @Slf4j @Aspect public class MyAspectDemo { @Before("@annotation(com.example.demo.aspect.MyAspect)") public void doBefore(){ log.info("我是 MyAspectDemo"); } }
在方法上添加自定义注解。
@RequestMapping("/test") @RestController @Slf4j public class TestController { @MyAspect @RequestMapping("/t1") public void test1(){ log.info("我是 test1"); } }
运行程序,访问 test1 方法。
3.6 Spring AOP 的实现方式(常见面试题):
基于注解 @Aspect。
基于自定义注解(@annotation)。
基于 Spring API(通过 xml 配置的方式,自从 SpringBoot 广泛使用之后,这种方法几乎看不到了)。
基于代理来实现(更加久远的一种实现方式,写法笨重,不建议使用)。
本文系转载,版权归原作者所有,如若侵权请联系我们进行删除!
云掣基于多年在运维领域的丰富时间经验,编写了《云运维服务白皮书》,欢迎大家互相交流学习:
《云运维服务白皮书》下载地址:https://fs80.cn/v2kbbq
想了解更多大数据运维托管服务、数据库运维托管服务、应用系统运维托管服务的的客户,欢迎点击云掣官网沟通咨询:https://yunche.pro/?t=shequ