前言
AOP专业的解释:在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方
式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个
热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑
的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高
了开发的效率。总结的话就是隔离、解耦处理业务。
一、spring aop 中的几个概念:
编程中,对象与对象之间,方法与方法之间,模块与模块之间都是一个个切面。
概念 | 解释 | 备注 |
---|---|---|
Aspect(切面) | Aspect 声明类似于 Java 中的类声明,在 Aspect 中会包含着一些 Pointcut 以及相应的 Advice。 | |
Joint point(连接点) | 表示在程序中明确定义的点,典型的包括方法调用,对类成员的访问以及异常处理程序块的执行等等,它自身还可以嵌套其它 joint point。 | |
Pointcut(切点) | 表示一组 joint point,这些 joint point 或是通过逻辑关系组合起来,或是通过通配、正则表达式等方式集中起来,它定义了相应的 Advice 将要发生的地方。 | |
Advice(增强) | Advice 定义了在 Pointcut 里面定义的程序点具体要做的操作,它通过 before、after 和 around 来区别是在每个 joint point 之前、之后还是代替执行的代码。 | |
Target(目标对象) | 织入 Advice 的目标对象.。 | |
Weaving(织入) | 将 Aspect 和其他对象连接起来, 并创建 Adviced object 的过程 | |
@Before | 标注在方法上面,定义了一个前置通知,通过value引用了上面已经定义的切入点,表示这个通知会对Service1中的所有方法生效,在通知中可以通过这个类名.方法名()引用@Pointcut定义的切入点,表示这个通知对这些切入点有效,若@Before和@Pointcut在一个类的时候,直接通过方法名()引用当前类中定义的切入点 | |
@AfterReturning | 可以拿到返回结果进行打印日志等操作 | |
@AfterThrowing | 定义了一个异常通知,也是对通过value引用了上面已经定义的切入点,表示这个通知会对Service1中的所有方法生效,若Service1中的方法抛出了Exception类型的异常,都会回调afterThrowing方法。 | |
@Around | 环绕通知,目标类、方法获取和耗时计算使用 |
二、Pointcut的12种用法来决定能切啥:
Pointcut的作用就是标注在方法上来定义切入点,常用的我们定义的是包,controller或者service。
表达式标签介绍和说明:
标签名 | 说明 | 备注 |
---|---|---|
execution | 用于匹配方法执行的连接点 | |
within | 用于匹配指定类型内的方法执行 | |
this | 用于匹配当前AOP代理对象类型的执行方法;注意是AOP代理对象的类型匹配,这样就可能包括引入接口也* 类型匹配 | |
target | 用于匹配当前目标对象类型的执行方法;注意是目标对象的类型匹配,这样就不包括引入接口也类型匹配 | |
args | 用于匹配当前执行的方法传入的参数为指定类型的执行方法 | |
@within | 用于匹配所以持有指定注解类型内的方法 | |
@target | 用于匹配当前目标对象类型的执行方法,其中目标对象持有指定的注解 | |
@args | 用于匹配当前执行的方法传入的参数持有指定注解的执行 | |
@annotation | 用于匹配当前执行方法持有指定注解的方法 | |
bean | Spring AOP扩展的,AspectJ没有对于指示符,用于匹配特定名称的Bean对象的执行方法 |
10种标签组成了12种用法,下面介绍比较常用的两种标签execution、annotation使用
2.1 execution
execution使我们常用的表达式:
使用execution(方法表达式)匹配方法执行。
用法见下图:
2.2 annotation注解:
用法:@annotation(注解类型):匹配被调用的方法上有指定的注解。
定义注解:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MetricCounter
切面注解:
@Aspect
@Component
public class MethodCounterAspect {
@Autowired
private MeterRegistry meterRegistry;
@Pointcut("@annotation(***.annotation.MetricCounter)")
public void pointcut() {
}
总结:
上面就是针对切面aop的我的使用总结,在工作当中能把上面两种比较常用的execution和@annotation使用熟练就非常的了不起了。欢迎进行留言,转载。