AOP(Aspect Oriented Programming)简介:AOP(面向切面编程)是一种编程范式,它通过在程序中定义特定的切入点(Join Point)和相应的通知(Advice),实现对程序行为的横向切割和重用。好比Java面向对象编程思想。
在AOP中,程序的核心业务逻辑被称为目标对象(Target Object),而围绕目标对象的横切关注点(Cross-cutting Concerns),例如日志记录、性能监测、事务管理等,被称为切面(Aspect)。切面定义了在哪些切入点上执行哪些通知。
AOP的关键概念包括:
-
切入点(Join Point):程序执行过程中能够插入切面的点,通常是方法的调用、方法的执行、异常的抛出等。
-
通知(Advice):切面在切入点上执行的动作,例如在方法调用前后执行、方法抛出异常时执行等。
-
切面(Aspect):横切关注点的模块化单元,它由切入点和通知组成。
-
织入(Weaving):将切面应用到目标对象中的过程,可以在编译时、加载时或运行时进行。
AOP的好处在于它能够将横切关注点与核心业务逻辑分离,提高了代码的模块化、可维护性和可重用性。通过AOP,我们可以将一些通用的功能从核心业务逻辑中抽离出来,避免了代码的重复,同时也使得关注点更加集中和清晰。
在Java开发中,常用的AOP框架包括Spring AOP、AspectJ等,它们提供了方便的注解或配置方式来定义切面和通知,并在运行时进行织入操作,从而实现AOP的功能。
本文将基于Spring进行AOP的讲解
首先要了解基本名词概念:
连接点:要执行功能增强器的类中所有的方法都叫做连接点
例如要对这个类 的某些功能做个增强,那么这个类中所有的方法都叫做连接点。
切入点:切入点就是你具体要对哪些方法进行功能增强。比如说我想对print1方法进行增强那么这个方法就是切入点。
通知:实现功能增强的代码称为通知。通知分为前置通知(Before Advice)在目标方法执行之前执行的通知。可以在通知方法中添加一些前置操作,例如参数验证、日志记录等。
后置通知(After Advice)在目标方法执行之后执行的通知。无论目标方法是否抛出异常,后置通知都会执行。常用于资源释放、日志记录等操作。
返回通知(After Returning Advice)在目标方法成功执行并返回结果后执行的通知。可以访问目标方法的返回值,并进行一些额外的处理,例如日志记录、结果转换等。
异常通知(After Throwing Advice):在目标方法抛出异常后执行的通知。可以捕获目标方法抛出的异常,并进行相应的处理,例如异常处理、错误日志记录等。
环绕通知(Around Advice):在目标方法执行前后环绕执行的通知。它可以完全控制目标方法的执行过程,可以在目标方法执行前后添加额外的逻辑,甚至可以决定是否执行目标方法。
其中环绕通知最为常用可以实现其它四个通知
这个类中@Pointcut注解用于指定对位于某个包下面的某个方法进行功能的实现。void表示对应的返回值,后面参数表示为路径(切入点表达式)。可以使用通配符代替。对于本类中method方法就是对对应方法所做的功能实现,也就是通知,@Around表示是环绕通知。由众多的method方法组成的类成为切面。@Componen是让Spring把此类标记为组件,@Aspect用于在Java类中标识一个切面(Aspect)的定义。
环绕通知使用时尽量使用Object作为返回值
参数ProceedingJoinPoint用于原始方法的执行。比如这个method2()方法,我在调用前先输出了一些内容包括方法类型,方法名称等。然后调用proceed方法进行原始方法的调用,最后在输出了一些内容,并将返回值进行返回。这个返回值可以进行更改,原始方法得到的就是这个method2()方法的返回值。
当然方法的形参也可以进行获取并进行一定的修改再次传入
这样原始方法参数原本是100,这样需修改后执行时参数就变为12,然后再执行程序。这个操作可以用来进行数据的纠正,比如密码系统,我们可以使用此方法进行密码的去空格操作等,再把密码作为参数传入在进行校验。注意的是使用的同时要在配置类上加上@EnableAspectJAutoProxy注解。因为AOP通过代理模式实现这个注解等于告诉Spring开启AspectJ(一个功能强大的面向切面编程(AOP)框架)的自动代理功能。