Spring AOP:面向切面编程的最佳实践 ( 三 )

4.AOP核心概念

4.1.切面 (Aspect)

定义:切面是横切关注点的模块化实现,这个关注点可能会横切多个对象,它包含一组相关的通知和切点,共同定义了切面的行为和应用范围。它与类相似,只是两者的关注点不一样,类是对物体特征的抽象,而切面横切性关注点的抽象。

@Aspect
@Component
public class AspectAop {

	// 切点
	
	// 通知

}

4.2.连接点 (Join Point)

  • 定义:连接点是指程序执行过程中某个特定点,如方法调用、字段访问或异常抛出等。在 Spring AOP 中,连接点通常是方法执行的开始或结束。

  • 列举一些常见的连接点类型。

    • 方法执行 (execution(* com.example.service.*.*(..))):这是 Spring AOP 最常用的连接点类型。

    • 构造器调用 (execution(* com.example.service.*(..))):构造器的调用也可以被视为连接点。

    • 异常抛出 (throwing(pointcut, ..)):当方法抛出异常时发生的连接点。

4.2.切点 (Pointcut)

  • 定义:切点是一组连接点的集合,它定义了切面应该在哪些连接点应用。 切点通常是通过匹配规则来指定的,例如匹配特定的方法签名。

  • 介绍如何使用表达式来指定切点。

    • execution(* com.example.service.*.*(..)):这个切点表示所有 com.example.service 包下的所有类的所有方法。
    • @annotation(com.example.MyAnnotation):这个切点表示所有被 MyAnnotation 注解的方法。
execution(* com.yuan.aop.GymAop.*(..))

4.3.通知 (Advice)

  • 定义:通知是切面在特定连接点所采取的行动。根据通知的时机,它可以是前置通知(before)、后置通知(after)、环绕通知(around)等。
    //前置的方法
    // 功能 A : 推荐老师
    @Before("execution(* com.yuan.aop.GymAop.*(..))")
    public void selectMaster(JoinPoint joinPoint) {
      //...
    }


    //后置的方法
    //功能 B : 结束提示
    @After("execution(* com.yuan.aop.GymAop.*(..))")
    public void  overTip(JoinPoint joinPoint ){
      // ...
    }


    //环绕的方法
    @Around("execution(* com.yuan.aop.GymAop.*(..))")
    public Object doBasicProfiling(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
     	// ...
        //执行方法
        Object obj = proceedingJoinPoint.proceed(args);
     	//...
        // 方法返回值
        return obj;
    }

4.5.目标对象(Target)

  • 定义: 目标对象是指需要被增强的对象,也就是你想要在其上应用切面逻辑的实际业务对象。在 AOP 中,目标对象通常是业务逻辑的一部分,它执行具体的业务功能。

    如:GymAop

4.6.代理(Proxy)

  • 定义: 代理是在 AOP 中为目标对象创建的一个包装器,它包含对目标对象的引用,并在调用目标对象的方法之前或之后执行额外的操作。代理的主要目的是拦截对目标对象的调用,以便能够执行横切关注点(cross-cutting concerns),比如事务管理、日志记录等。

  • 与 目标对象的关系

    • 创建: 代理对象是由 AOP 容器(如 Spring AOP)动态创建的,它围绕着目标对象创建。
    • 调用: 当客户端代码调用目标对象的方法时,实际上是在调用代理对象,而代理对象再调用目标对象的方法。
    • 透明性: 对于客户端代码而言,代理看起来就像目标对象一样,客户端并不需要知道其内部细节。
  • 与切面 关系

    • 代理 是一个具体的对象,它实现了切面定义的行为。它是 AOP 的一种实现手段。
    • 切面 描述了一组关注点及其行为,它定义了通知应该在何处执行。
    • 代理 是在运行时动态创建的,而 切面 是静态定义的,它在编译时或运行时被解析并应用于程序中。
    • 代理切面 密切相关,代理是根据切面定义的行为来创建的,而切面定义了代理应该如何工作。

4.7.织入 (Weaving)

  • 定义: 织入是指将切面的横切关注点(cross-cutting concerns)插入到应用程序的普通业务逻辑中的过程。简单来说,就是将切面定义的通知(advice)与目标对象的方法进行绑定。织入使得横切关注点能够在不影响业务逻辑的情况下被执行,从而实现模块化和解耦。

  • 织入的时间: 织入可以在不同的时间点发生,这取决于所使用的 AOP 实现:

    编译时织入 (Compile-Time Weaving):

    • 定义: 在编译阶段将切面逻辑插入到源代码或字节码中。
    • 工具: 例如 AspectJ 编译器。
    • 优点: 可以在编译时完成所有的织入工作,运行时无需额外的开销。
    • 缺点: 需要特殊的编译器或预处理器。

    类加载时织入 (Load-Time Weaving):

    • 定义: 在类加载到 JVM 时进行织入。
    • 工具: 例如使用 AspectJ 的 load-time weaver 或者其他类加载器插件。
    • 优点: 不需要特殊的编译器,可以在运行时动态修改类的行为。
    • 缺点: 类加载时织入可能会增加启动时间。

    运行时织入 (Runtime Weaving):

    • 定义: 在程序运行期间动态地创建代理对象,并将切面逻辑插入到这些代理对象中。
    • 工具: 如 Spring AOP 使用的是基于代理的方式。
    • 优点: 灵活性高,可以根据运行时的状态动态地调整织入行为。
    • 缺点: 运行时织入可能会带来一定的性能开销。

5.SpringAOP

5.1.特点

Spring AOP 是 Spring 框架的一个组成部分,它与其他 AOP 实现(如 AspectJ)的主要区别在于其实现机制和使用场景。Spring AOP 的特点包括:

  • 基于代理:Spring AOP 主要通过动态代理来实现 AOP 功能。对于实现了接口的目标对象,Spring 使用 JDK 动态代理;对于未实现接口的对象,则使用 CGLIB 字节码生成技术来创建代理。
  • 非侵入性:Spring AOP 的实现不需要对源代码进行任何修改,因此它是非侵入式的。
  • 与 Spring IoC 集成:Spring AOP 与 Spring 的依赖注入(DI)和面向接口编程紧密结合,使得切面和被通知的对象可以很容易地配置和管理。
  • 有限的切入点表达式:Spring AOP 支持基于方法调用的切入点表达式,但与 AspectJ 相比,它的表达式语言较为简单,不支持字段访问和异常抛出等更复杂的切入点类型。

5.2.实现步骤

Spring AOP 利用代理模式来实现代理对象,这些代理对象可以在目标对象的方法调用前后添加额外的行为。Spring AOP 的实现机制可以概括为以下几个步骤:

  1. 定义切面:首先定义一个切面,该切面包含切点和通知。
  2. 创建代理:Spring AOP 会在运行时为需要拦截的目标对象创建一个代理。
  3. 代理调用:当客户端代码调用目标对象的方法时,实际上是调用了代理对象。
  4. 通知执行:代理对象会根据切点匹配规则,在方法调用前后执行相应的通知。
  5. 返回结果:代理对象将最终的结果返回给客户端。

5.3.与AspectJ 的关系

  • 相同点:两者都是面向切面编程的实现,都可以用来解决横切关注点问题。

  • 不同点 :

    • 实现机制:Spring AOP 主要使用代理模式实现,而 AspectJ 可以在编译时或加载时进行编织。
    • 切入点表达式:AspectJ 支持更复杂的切入点表达式,如字段访问和异常抛出等,而 Spring AOP 的切入点表达式相对简单。
    • 使用方式:Spring AOP 更多地依赖于 Spring 的配置机制,而 AspectJ 可以独立于任何框架使用。
  • 9
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值