AOP核心概念

AOP的基础概念详解

  • AOP:面向切面编程
  • OOP:面向对象编程
  • AOP的作用:可以针对目标对象进行无感知(在不修改代码的情况下)功能增强
    • 功能分为业务功能和系统功能
      • 业务功能:业务操作
      • 系统功能:事物、日志、安全等
  • AOP可以将业务功能和系统功能进行拆分、专人干专事
  • AOP是一种思路,它的实现产品有多种:AspectJ、spring AOP、spring和AspectJ整合
  • AOP是通过哪种实现无感知的功能增强?
    • 静态织入
      • 使用字节码拼接技术,在编译期间,针对目标对象对应的class文件进行静态编码(asm)
    • 动态织入
      • 使用动态代理技术,在运行期间,针对目标对象进行动态代理

AOP核心概念分析

  • 连接点
  • 切入点
  • 目标对象
  • 代理对象
  • 通知
  • 切面/通知器
  • 引介

AOP核心概念图式

代理技术

  • 静态代理
    • 在编译期间,为目标类,编写一个代理类,缺点是会编写很多的代理类
  • 动态代理
    • 在运行期间,为目标类,利用动态代理技术产生代理对象

动态代理模式

  • JDK动态代理
    • 代理对象和目标类对象是实现了同一个接口的
    • 使用这种代理技术的前提是:目标对象必须实现某一个业务接口
  • CGLib动态代理
    • 代理对象是目标对象的子类,它是通过对目标对象实现继承的方式,进行功能增强
    • 使用这种代理技术的前提是:不需要目标对象必须实现某一个业务接口
  • JDK动态代理是Spring默认使用的

JDK动态代理(有接口的目标对象)

  • 产生代理对象流程(Proxy.newProxyInstance(classloader,interfaces,InvoationHandler))
    • 通过反射可以获取接口的信息,然后由java来编写代理实现类的源代码(.java文件)
    • java来对它自己写的源代码进行编译(API),产生class文件
    • 产生的class文件,需要通过classloader加载加载到jvm内存中
    • 在jvm中产生代理对象
  • 产生代理对象的底层原理
    • 由JDK编写代理类的原文件(.java)-------interfacers,InvocationHandler
    • 由JDK编译成class文件
    • 使用传入的classloader加载class文件
  • 代理对象调用流程:InvocationHandler.invoke(proxy,method,args)方法
    • 根据通知位置编写增强代码
    • 调用目标对象的方法
    • InvocationHandler.invoke(proxy,method,args){
          before();
          //调用目标对象的目标方法
          after();
      }

       

CGLIB动态代理模式(没有接口和非final目标对象)---ASM(生成和修改字节码的工具包)

  • 如何产生代理对象
    • Enhancer enhancer=new Enhancer();
      enhancer.setSuerClass(目标对象的class对象);
      enhancer.setCallback(MethodInterceptor的实现类);
      Object proxy=enhancer.create();

       

  • 产生代理对象的底层原理
    • 使用ASM工具包去针对目标类的class文件,进行修改,产生新的class文件
  • 如何执行代理对象

    • MethodInterceptor的实现类.intercept(proxy,targetMethod,args,proxyMethod){
          //before();
          调用目标对象的目标方法
          //Method.invoke(target,args);
          methodProxy.invokeSuper(proxy,args);
          //after();
      }

       

  • 由InvocationHandler和MethodInterceptor产生的思考

    • 如果invoke方法和intercept方法是我们程序员写好的,那怎么保证功能的扩展性呢?

    • 通过配置去确定加哪些通知(前置、后置、最终)

    • 通过一定的逻辑(执行链条--MethodInvocation和MethodInterceptor去完成)去控制多个通知的执行顺序

    • 多个前置通知的顺序如何保证?

    • 一个前置通知和一个后置通知的执行顺序如何保证?
Spring AOP(面向切面编程)是Spring框架中的一个重要模块,用于实现横向关注点的模块化开发。核心概念包括以下几个部分: 1. 切面(Aspect):切面是一个模块化的单元,它封装了与横向关注点相关的行为。在Spring AOP中,切面可以是一个类,其中包含了一组通知和切点。 2.通知(Advice):通知定义了在切面的何处以及如何插入代码。在Spring AOP中,有以下几种类型的通知: - 前置通知(Before Advice):在目标方法执行之前执行的通知。 - 后置通知(After Advice):在目标方法执行之后执行的通知,无论目标方法是否抛出异常。 - 返回通知(After Returning Advice):在目标方法成功执行并返回结果后执行的通知。 - 异常通知(After Throwing Advice):在目标方法抛出异常时执行的通知。 - 环绕通知(Around Advice):在目标方法执行前后都可以执行的通知。 3. 切点(Pointcut):切点是指那些被通知所应用的连接点的集合。通过使用表达式或者注解等方式定义切点,可以精确地指定哪些方法将被通知所拦截。 4. 连接点(Join Point):连接点是在应用执行过程中能够插入切面的点。例如,在方法调用、方法执行、异常处理等时刻都是连接点。 5. 织入(Weaving):织入是将切面应用到目标对象并创建新的代理对象的过程。Spring AOP支持编译时织入、类加载时织入和运行时织入三种方式。 Spring AOP基于动态代理机制实现,通过在运行时动态生成代理对象,在目标方法执行前后插入通知代码来实现横向关注点的功能。它使得开发者能够将横向关注点与业务逻辑解耦,提高了代码的可维护性和可重用性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值