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 连接点的主要内容,如果未能解决你的问题,请参考以下文章

Spring-AOP学习笔记-04 注解配置

Spring-AOP学习笔记-01 初识AOP

Spring-AOP学习

学习笔记:python3,代码片段(2017)

spring-AOP(面向切面编程)

Python 3学习笔记