Spring Aop

简介

aop(面向切面编程)是对oop(面向对象编程)的补充和扩展.众所周知,java以其将一系类具有相同属性和行为的事物封装为对象.但是要对一系类对象进行操作(比如监听),则会产生冗余代码.因此,引入aop编程来实现对一系列对象的控制.

原理

所使用的的是动态代理.在spring5中,在选择代理方式的时候,会根据代理的对象是否实现了接口,来动态的选择代理的方式.主要有两种方式:

  1. jdk的动态代理:

    需要代理的对象必须实现接口.由于java是单继承,而jdk的动态代理是生成一个继承了proxy的代理对象.因此就想要具有被代理类的特性,就无法再去继承了,只能以实现接口的方式.使用代理对象,调用invoke()方法,通过反射实现方法的调用.

  2. cglib的动态代理:

    不需要实现接口.会动态生成一个被代理对象的子类.以callback()的方式来实现方法的调用.

注解组成(AspectJ)

  1. @AspectJ:切面.

  2. @PointCut:切入点.

    | 切点指示器 | 功能描述 | | ————- | ————————————– | | args() | 通过判断目标方法的入参类型 | | @args() | 通过判断目标方法的入参是否含有指定注解 | | execution() | 满足某一匹配条件 | | this() | 满足代理类的所有连接点 | | target() | 目标对象为指定类型,比this()范围小 | | @target() | 目标对象为指定注解 | | within() | 和execution()相似,但是最低精确到类 | | @within() | 匹配指定注解的类及其子类 | | @annotation() | 匹配带有指定注解的连接点 |

  3. @Before:前置通知.

  4. @AfterRunning:后置通知.

  5. @Around:环绕通知.

  6. @AfterThrowing:异常通知.

Last updated

Was this helpful?