spring中aop如何实现原理

fiy 其他 46

回复

共3条回复 我来回复
  • worktile的头像
    worktile
    Worktile官方账号
    评论

    Spring中的AOP(面向切面编程)是通过动态代理实现的。具体实现原理如下:

    1. 标记要被增强的方法或类:在Spring中,我们可以通过注解或配置文件的方式来标记需要被增强的方法或类。常用的注解包括@AspectJ和@Pointcut。

    2. 创建切面:切面是一个类,其中定义了增强逻辑。在切面中,我们可以定义Before、After、Around等不同的增强类型。Spring根据切面的定义自动生成代理类。

    3. 创建代理对象:Spring使用JDK动态代理和CGLIB动态代理两种方式创建代理对象。如果被代理的对象实现了接口,Spring会使用JDK动态代理;如果被代理的对象没有实现接口,Spring会使用CGLIB动态代理。

    4. 注入目标对象:Spring将代理对象注入到目标对象的容器中,通过代理对象来调用目标方法。

    5. 执行增强逻辑:当调用目标方法时,代理对象会先执行增强逻辑,然后再调用目标方法。

    6. 回调目标方法:增强逻辑执行完毕后,代理对象会调用目标方法。

    总结起来,Spring的AOP实现原理就是通过动态代理技术,在目标对象的方法执行前后插入增强逻辑。这种方式使得我们可以将一些公共的横切逻辑(如日志记录、事务管理等)从业务逻辑中解耦出来,提高了代码的重用性和可维护性。

    1年前 0条评论
  • 不及物动词的头像
    不及物动词
    这个人很懒,什么都没有留下~
    评论

    Spring中的AOP(面向切面编程)是通过使用动态代理技术来实现的。在Spring中,AOP的原理主要是基于动态代理,它可以在不改变源代码的情况下,通过额外的代码进行横切关注点的管理。

    1. 代理模式
      在Spring中,AOP采用的是JDK动态代理和CGLIB动态代理两种方式来实现代理。JDK动态代理是基于接口的代理,而CGLIB动态代理是基于类的代理。当目标对象实现了接口时,Spring就会选择使用JDK动态代理,否则会使用CGLIB动态代理来生成代理类。

    2. 切入点(Pointcut)
      切入点是指在目标对象方法中定义的一个点,AOP会在该点上进行切面处理。Spring中可以通过配置XML或使用注解的方式来定义切入点。切入点通常会使用表达式来选择匹配的方法。

    3. 通知(Advice)
      通知是定义在切入点上进行执行的操作,可以在目标方法之前或之后执行,也可以在抛出异常时执行,有以下几种类型的通知:

    • 前置通知(Before advice):在目标方法执行之前执行。
    • 后置通知(After advice):在目标方法执行之后执行,无论是否发生异常。
    • 返回通知(After returning advice):在目标方法正常返回后执行。
    • 异常通知(After throwing advice):在目标方法抛出异常后执行。
    • 环绕通知(Around advice):在目标方法执行前后同时执行。
    1. 切面(Aspect)
      切面是将通知和切入点组合起来的一种概念,它定义了在特定切入点上执行的通知类型。一个切面可以包含多个通知,以及定义切入点表达式。在Spring中,切面可以通过XML配置文件或使用注解的方式进行配置。

    2. 织入(Weaving)
      织入是将切面应用到目标对象的过程,它可以在三个时期进行:

    • 编译期织入(Compile-time weaving):在编译阶段将切面编织到目标类中。
    • 类加载期织入(Load-time weaving):在目标类被加载到JVM时动态织入切面。
    • 运行期织入(Runtime weaving):在目标对象被创建实例时动态织入切面。

    综上所述,Spring中的AOP通过代理模式和动态代理实现,通过切入点和通知来选择切面和执行操作,并通过织入方式将切面应用到目标对象上。实现AOP可以帮助我们在不改变原有代码结构的情况下,对横切关注点进行管理,提高系统的可维护性和扩展性。

    1年前 0条评论
  • fiy的头像
    fiy
    Worktile&PingCode市场小伙伴
    评论

    Spring中的AOP(面向切面编程)是通过动态代理实现的,可以分为基于接口的动态代理和基于类的动态代理两种方式。

    1. 基于接口的动态代理实现原理:
      Spring使用了JDK的动态代理机制来实现基于接口的动态代理。当目标类实现了接口后,Spring会自动使用JDK的动态代理机制来生成代理对象。JDK动态代理机制是通过在运行时创建一个实现目标接口的匿名代理类,并将调用委托给目标对象来实现代理的。

    2. 基于类的动态代理实现原理:
      当目标类没有实现接口时,Spring会使用CGLIB(Code Generation Library)库来实现基于类的动态代理。CGLIB通过生成目标类的子类,并重写其中的方法,实现代理功能。

    AOP的实现原理可以分为两个关键步骤:切入点定位和通知织入。

    1. 切入点定位:
      切入点是指在目标对象的方法中需要插入额外逻辑的位置。Spring使用切入点表达式(Pointcut Expression)来定义切入点,指定需要拦截的方法。通过在配置文件(例如xml或注解)中配置切入点表达式,Spring可以自动识别并匹配到对应的方法。

    2. 通知织入:
      通知是指在切入点前、后或异常抛出时执行的额外逻辑代码。Spring支持五种类型的通知:前置通知(Before)、后置通知(After)、返回通知(After-returning)、异常通知(After-throwing)和环绕通知(Around)。织入是指将通知代码织入到目标对象的方法中。Spring使用代理对象将通知织入到目标方法的不同位置。

    Spring AOP的工作流程如下:

    1. Spring容器加载:Spring容器启动时会读取配置文件,并根据配置创建相应的Bean,包括切面类和目标对象。

    2. 切面类实例化:Spring容器会实例化切面类,并将其加入到切面列表中。

    3. 目标对象创建:Spring根据配置创建目标对象的实例。

    4. 切入点定位:Spring根据切入点表达式,定位到目标对象需要拦截的方法。

    5. 通知织入:Spring通过动态代理技术,在目标对象方法的前、后或异常抛出时,织入相应的通知逻辑。

    6. 目标方法调用:当其他代码调用目标对象的方法时,实际上是调用代理对象的方法。

    7. 通知执行:代理对象根据织入的通知,在目标方法调用前、后或异常抛出时,执行相应的通知逻辑。

    通过以上步骤,Spring AOP就实现了对目标对象方法的拦截和增强。这样,我们可以在不修改目标对象源码的情况下,通过AOP来实现一些横切关注点(如日志、权限、事务等)的统一处理。

    1年前 0条评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部