Spring Aop都能切啥?

前言

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用于匹配当前执行方法持有指定注解的方法
beanSpring AOP扩展的,AspectJ没有对于指示符,用于匹配特定名称的Bean对象的执行方法

10种标签组成了12种用法,下面介绍比较常用的两种标签execution、annotation使用

2.1 execution

execution使我们常用的表达式:
使用execution(方法表达式)匹配方法执行。
用法见下图:
alt text

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使用熟练就非常的了不起了。欢迎进行留言,转载。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值