前言
横切关注点
使用 @AspectJ 定义切面。
同时还需要在配置类上应用 @EnableAspectJAutoProxy 注解,启用 AOP 自动代理。(不添加它的话,@AspectJ 注解的类只会被当作普通 Bean)
定义切点
使用 @Pointcut 定义切点,其参数为切点表达式,切点表达式由以下三大部分组成:
通配符
*
:匹配任意非空白字符..
:匹配任意数量的子包或者参数。+
:匹配指定类及其子类。(感觉一般是用在表达式末尾)
运算符
与或非
指示器 (designators)
重点是 exectution,其他的可以用的时候再查
添加通知 (Advice)
环绕通知的 ProceedingJoinPoint 参数
环绕通知方法必须有一个 ProceedingJoinPoint 参数,并且要在前置通知完成后,调用该对象的 proceed() 方法,该方法会将控制权返回给切点方法。切点方法执行完毕后,会继续执行 proceed() 方法后的代码。
proceed() 方法就相当于前置通知和后置通知的分界点。
环绕通知的代码,通常都会写在一个 try-catch 块里,如果运行抛出异常,catch 块的内容即相当于 AfterThrowing 通知。
处理通知中的参数
从命令切点到通知方法的参数转移:args 指示器
代理
待续
参考
- Spring 实战 第4版
- Aspect Oriented Programming with Spring
- 探秘 Spring AOP - 慕课网