0


Spring AOP原理

博主主页: 码农派大星.

** 数据结构专栏**:Java数据结构

** 数据库专栏:**MySQL数据库

**JavaEE专栏:**JavaEE

软件测试专栏:软件测试

关注博主带你了解更多知识

前言: Spring AOP是基于动态代理来实现AOP的

1. 代理模式

定义:为其他对象提供⼀种代理以控制对这个对象的访问.它的作⽤就是通过提供⼀个代理类,让我们 在调⽤⽬标⽅法的时候,不再是直接对⽬标⽅法进⾏调⽤,⽽是通过代理类间接调⽤

在某些情况下,⼀个对象不适合或者不能直接引⽤另⼀个对象,⽽代理对象可以在客⼾端和⽬标对象之 间起到中介的作⽤

代理模式的主要角色

  1. Subject: 业务接⼝类.定义了真实对象和代理对象共有的接口,这样代理可以用来代替真实对象可以是抽象类或者接⼝

  2. RealSubject: 业务实现类. 定义了代理所代表的真实对象,实现了主题接口,具体的业务执⾏,也就是被代理对象.

  3. Proxy: 代理类.RealSubject的代理,包含对真实主题的引用,实现了和真实主题相同的接口,并在内部控制对真实主题的访问。

代理模式的类型

静态代理:由程序员创建代理类或特定⼯具⾃动⽣成源代码再对其编译,在程序运⾏前代理类的 .class ⽂件就已经存在了.

动态代理:在程序运⾏时,通过反射机制动态创建代理类。

动态代理

相⽐于静态代理来说,动态代理更加灵活

JDK动态代理

它不需要代理类和目标类实现相同的接口,而是通过反射机制来实现

JDK动态代理的工作原理

  1. 定义接口:被代理的对象需要实现一个或多个接口。
  2. 实现InvocationHandler:创建一个实现了InvocationHandler接口的类,并在其中定义一个invoke方法,该方法将作为所有代理方法调用的统一入口。
  3. 创建代理对象:使用Proxy.newProxyInstance方法在运行时动态创建代理对象。
  4. 调用代理对象的方法:当代理对象的方法被调用时,InvocationHandlerinvoke方法也会被调用,你可以在这个方法中定义代理逻辑,如日志记录、权限检查等

JDK动态代理的特点

  • 无需实现接口:代理类不需要实现任何接口,所有的代理逻辑都封装在InvocationHandlerinvoke方法中。
  • 动态性:代理对象是在运行时创建的,可以根据需要动态地创建不同的代理对象。
  • 灵活性:可以在invoke方法中定义复杂的逻辑,如权限控制、事务管理等。
  • 限制:只能为接口创建代理,不能为类创建代理
CGLIB动态代理

JDK动态代理有⼀个最致命的问题是其只能代理实现了接⼝的类

实现原理

CGLIB动态代理通过生成目标类的子类来实现代理,因此它可以代理没有实现接口的普通类。

优缺点

优点:CGLIB动态代理可以代理没有接口的类,方法调用性能较高,避免了反射调用。

缺点:创建代理类时需要进行字节码操作,性能开销较大,并且需要依赖cglib和ASM库

JDK动态代理:当你的目标对象实现了接口,并且你希望使用一种简单且性能较好的代理机制时,JDK动态代理是一个不错的选择。

CGLIB动态代理:当你需要代理没有实现接口的类,或者需要代理

final

类时,CGLIB动态代理提供了一个有效的解决方案

总结:

Spring AOP是基于动态代理实现的,有两种⽅式:

1.基本JDK动态代理实现

2.基于CGLIB动态代理实现.

运⾏时使⽤哪种⽅式与项⽬配置和代理的对象有关

标签: spring java 后端

本文转载自: https://blog.csdn.net/jj666mhhh/article/details/143830230
版权归原作者 码农派大星. 所有, 如有侵权,请联系我们删除。

“Spring AOP原理”的评论:

还没有评论