Spring-AOP学习笔记-02 连接点
Posted Moon&&Dragon
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring-AOP学习笔记-02 连接点相关的知识,希望对你有一定的参考价值。
4 连接点
连接点指的就是根据切点 拦截到的具体方法,因为spring的aop是方法级别,所以这里的连接点全部指的是具体的方法。
如果我们想要获取到连接点的话,我们需要导入另外一个 依赖-AspectJ
4.1 AspectJ
aspectJ全名是Eclipse AspectJ,它来自于Eclipse基金会,是一个完整的aop方案框架,它可以拦截到的连接点就不是单纯的方法级别了,它全部都可以拦截,他和spring的区别是:
spring是方法级别,aspectJ是全级别
spring是动态织入,aspectJ是静态织入
Spring使用JDK动态代理和Cglib动态代理,通过运行时在内存中生成零时的类文件来实现。
AspectJ则是通过它自己的编译器进行编译,在编译时直接修改了编的二进制class文件
spring性能慢,AspectJ性能快
导入AspectJ依赖
Maven
<dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.6</version> </dependency>
Gradle
implementation group: 'org.aspectj', name: 'aspectjweaver', version: '1.9.6'
4.2 JoinPoint
依赖导好后,我们在自己的书写方法中就可以拿到连接点,JoinPoint连接点是所有切面方法都可以拿到的,在里面封装的我们方法的信息。
拿到连接点:
public void before(JoinPoint joinPoint){...}
操作连接点:
public void before(JoinPoint joinPoint){ System.out.println("目标对象为:"+joinPoint.getTarget()); System.out.println("目标方法签名为:"+joinPoint.getSignature()); Object[] args = joinPoint.getArgs(); System.out.println("目标方法参数个数为:"+args.length); }
连接点方法:
getSignature() | 获得目标对象的签名,就是当前拦截到的方法 |
---|---|
getTarget() | 获得目标对象 |
getThis() | 获得正在执行的目标对象 |
getStaticPart() | 获得此连接点的静态部分 |
getSourceLocation() | 获得连接点对应的方法源地址,这里面的还包含的方法是使用不了的,Spring在重写时,直接抛出了不支持操作异常(UnsupportedOperationException) |
toLongString() | 获得连接点的扩展全命名 |
toShortString() | 获得连接点的缩写命名 |
getKind() | 返回该连接点的类型 |
getArgs() | 返回连接点的参数数组 |
4.3 ProceedingJoinPoint
该连接点是上面连接点的加强版,但是 只有环绕通知才可以获取到,它主要是可以操作连接点方法的运行。
获得ProceedingJoinPoint
public void before(ProceedingJoinPoint joinPoint){...}
操作连接点方法:
proceed()
这也是这个连接点的核心,需要手动操作拦截的连接点方法,默认不执行
public void before(ProceedingJoinPoint joinPoint){
try {
// 执行连接点方法
Object proceed = joinPoint.proceed();
} catch (Throwable throwable) {
// 为了避免事务失效,所以要将异常跑出去ΩΩ
throw throwable;
}
}
以上是关于Spring-AOP学习笔记-02 连接点的主要内容,如果未能解决你的问题,请参考以下文章