AOP 的基本概念

1、连接点(Joinpoint)

连接点是指在程序执行过程中可以被增强的方法。在一个类中,可能有多个方法可以被视为连接点,因为它们都有机会被添加额外的功能或行为。例如,在一个业务类中,多个业务方法都可以被认为是连接点,因为可以在这些方法执行前后或出现异常时进行一些额外的处理。

2、切入点(Pointcut)

切入点是实际被增强的连接点。虽然一个类中可能有很多潜在的连接点,但在实际应用中,只有特定的一些方法会被选择进行增强。比如在一个业务系统中,可能只对某些特定的业务方法如 add(添加操作)和 update(更新操作)进行增强,那么这些方法就被称为切入点。切入点是通过表达式来定义的,用于指定哪些连接点应该被增强。

3、通知(Advice)

通知是指在特定的连接点上要执行的增强功能。通知可以分为不同的类型:

方法执行前通知:在目标方法执行之前执行的通知。可以用于进行参数验证、记录日志等操作。

方法执行后通知:在目标方法执行之后执行的通知。可以用于记录方法的执行结果、进行资源清理等操作。

环绕通知:环绕目标方法执行的通知。可以在目标方法执行前后进行一些复杂的逻辑处理,并且可以控制目标方法是否执行以及如何执行。

4、目标(Target)

目标是指被代理的对象,也就是连接点和切入点所在的类。在 AOP 中,目标对象的方法会被增强,通过代理对象来调用目标对象的方法,并在适当的时候执行通知中的增强逻辑。

5、代理(Proxy)

当向目标对象应用通知时,会创建一个代理对象。代理对象封装了目标对象,并在调用目标对象的方法时,根据通知的类型执行相应的增强逻辑。代理对象可以透明地替代目标对象,使得调用者在不知道的情况下调用了增强后的方法。

另一种说法:

1.切面(Aspect):切面是通知和切点的结合体。它定义了哪些方法应该被增强以及如何增强。

2.连接点(Join Point):连接点是在程序执行过程中可以插入切面的地方。例如,方法调用、异常抛出等。

3.切点(Pointcut):切点是匹配连接点的规则。它定义了哪些连接点会被拦截并应用通知。

4.通知(Advice):通知是在特定连接点上执行的动作。常见的通知类型包括:

  1. Before:在目标方法执行前运行。
  2. After:在目标方法执行后运行,无论是否发生异常。
  3. After Returning:在目标方法成功执行后运行。
  4. After Throwing:在目标方法抛出异常后运行。
  5. Around:在目标方法执行前后都可以运行,并且可以控制目标方法的执行。

5.引入(Introduction):引入允许向现有的类添加新的方法或属性,从而改变类的行为。

6.织入(Weaving):织入是将切面应用到目标对象并创建新的代理对象的过程。织入可以在编译时、类加载时或运行时进行。

二、核心原理

AOP 的核心原理是使用动态代理的方式在执行方法前后或者出现异常的时候加入相关的逻辑。具体来说:

在目标方法执行前,可以进行一些前置处理,如权限判断。在执行方法前判断当前用户是否具有执行该方法的权限,如果没有权限则阻止方法的执行。

在目标方法执行后,可以进行后置处理,如日志记录。记录方法的执行时间、参数、返回值等信息,方便进行系统的监控和调试。

当目标方法执行出现异常时,可以进行异常处理,如事务回滚。如果在事务环境中,当方法出现异常时,自动回滚事务,保证数据的一致性。

springAOP 实现

1、Spring 对 AOP 的支持

Spring 是一个广泛使用的 Java 开发框架,它对面向切面编程(AOP)提供了强大的支持。通过 Spring AOP,可以轻松地将横切关注点(如日志记录、事务管理、安全检查等)与业务逻辑分离,提高代码的可维护性和可扩展性。

2、引入 AspectJ 的实现

AspectJ 是一个基于 Java 语言的强大 AOP 框架,它提供了丰富的 AOP 功能,并且实现方式更为简捷,使用更为方便。Spring 引入了 AspectJ 的 AOP 实现,使得开发者可以在 Spring 框架中使用 AspectJ 的注解和表达式来定义切面、切入点和通知。