2023-11-24 11:09

什么是AOP(面向切面编程)?

少尉

JavaEE

(178)

(0)

收藏

AOP是针对面向对象编程的一种补充,有时使用面向对象不能很好完成一些额外的功能业务时,可以采用AOP来进行补充。切面编程的目的就是为了将业务目标进行而外的增强或者扩展。Spring中的AOP是基于JDK动态代理和CGLIB动态代理实现的。


应用场景

日志操作:

可以在业务方法前后进行日志的记录,不需要每个业务方法中都编写重复的代码


权限管理:

可以在调用目标方法前确定是否有权限


事务管理 :

可以在调用业务方法前开启事务,方法执行完成后提交事务


AOP术语

切面(Aspect):

切面是用于编写切面逻辑的一个类,这个类很类似于JDK动态代理中的回调处理器或者cglib中的方法拦截器,主要就是将需要增强目标对象的功能代码编写在这个类中,而这些功能增强的代码就是切面逻辑。


通知/增强(Advice):

增强就是对目标行为植入额外的逻辑代码,从而增强原有的功能。增强分为五种类型:


1)前置通知(在目标方法调用之前执行)


2)后置通知(在目标方法正确返回之后执行)


3)环绕通知(在目标方法调用前后执行)


4)异常通知(当目标方法抛出异常时执行,并且不会执行后置通知)


5)最终通知(不管目标方法有无异常都会执行)


切入点(Pointcut):

切入点类似一个切入的坐标,目的就是要找到目标对象的哪些方法进行切入。切入点可以使用表达式进行描述。


连接点(Joinpoint):

目标对象的方法(被切入的方法)就称之为连接点,一个切入点可以对应目标对象的的多个连接点。


代理(Proxy):

在运行时动态创建的对象,称之为代理对象,负责调用目标对象的方法,并执行增强功能。


目标(Target):

被代理的对象就是目标对象。


织入(Weaver):

将切面中的增强逻辑应用到目标具体的连接点上并产生代理的过程称之为织入。


因此通常描述为“将通知织入到具体的目标”。


织入的时机可以分为以下几种:


类加载时织入,需要特殊的类加载器(LTW)


编译时织入,需要特殊的编译器(CTW)


运行时织入,通常使用JDK或者CGLIB在程序运行创建代理对象,


spring就是基于运行时织入的。(注意:spring仅仅只是用到了AspectJ的切入点表达式和注解,但并没有使用AspectJ的类加载和编译时织入功能,而是使用JDK和CGLIB在运行时生成代理对象。)

0条评论

点击登录参与评论