博主主页: 码农派大星.
数据结构专栏:Java数据结构
数据库专栏:MySQL数据库
JavaEE专栏:JavaEE
软件测试专栏:软件测试
关注博主带你了解更多知识
目录
前言: Spring AOP是基于动态代理来实现AOP的
1. 代理模式
定义:为其他对象提供⼀种代理以控制对这个对象的访问.它的作⽤就是通过提供⼀个代理类,让我们 在调⽤⽬标⽅法的时候,不再是直接对⽬标⽅法进⾏调⽤,⽽是通过代理类间接调⽤
在某些情况下,⼀个对象不适合或者不能直接引⽤另⼀个对象,⽽代理对象可以在客⼾端和⽬标对象之 间起到中介的作⽤
代理模式的主要角色
1. Subject: 业务接⼝类.定义了真实对象和代理对象共有的接口,这样代理可以用来代替真实对象可以是抽象类或者接⼝
2. RealSubject: 业务实现类. 定义了代理所代表的真实对象,实现了主题接口,具体的业务执⾏,也就是被代理对象.
3. Proxy: 代理类.RealSubject的代理,包含对真实主题的引用,实现了和真实主题相同的接口,并在内部控制对真实主题的访问。
代理模式的类型
静态代理:由程序员创建代理类或特定⼯具⾃动⽣成源代码再对其编译,在程序运⾏前代理类的 .class ⽂件就已经存在了.
动态代理:在程序运⾏时,通过反射机制动态创建代理类。
动态代理
相⽐于静态代理来说,动态代理更加灵活
JDK动态代理
它不需要代理类和目标类实现相同的接口,而是通过反射机制来实现
JDK动态代理的工作原理
- 定义接口:被代理的对象需要实现一个或多个接口。
- 实现InvocationHandler:创建一个实现了
InvocationHandler
接口的类,并在其中定义一个invoke
方法,该方法将作为所有代理方法调用的统一入口。- 创建代理对象:使用
Proxy.newProxyInstance
方法在运行时动态创建代理对象。- 调用代理对象的方法:当代理对象的方法被调用时,
InvocationHandler
的invoke
方法也会被调用,你可以在这个方法中定义代理逻辑,如日志记录、权限检查等
JDK动态代理的特点
- 无需实现接口:代理类不需要实现任何接口,所有的代理逻辑都封装在
InvocationHandler
的invoke
方法中。- 动态性:代理对象是在运行时创建的,可以根据需要动态地创建不同的代理对象。
- 灵活性:可以在
invoke
方法中定义复杂的逻辑,如权限控制、事务管理等。- 限制:只能为接口创建代理,不能为类创建代理
CGLIB动态代理
JDK动态代理有⼀个最致命的问题是其只能代理实现了接⼝的类
实现原理
CGLIB动态代理通过生成目标类的子类来实现代理,因此它可以代理没有实现接口的普通类。
优缺点
优点:CGLIB动态代理可以代理没有接口的类,方法调用性能较高,避免了反射调用。
缺点:创建代理类时需要进行字节码操作,性能开销较大,并且需要依赖cglib和ASM库
JDK动态代理:当你的目标对象实现了接口,并且你希望使用一种简单且性能较好的代理机制时,JDK动态代理是一个不错的选择。
CGLIB动态代理:当你需要代理没有实现接口的类,或者需要代理
final
类时,CGLIB动态代理提供了一个有效的解决方案
总结:
Spring AOP是基于动态代理实现的,有两种⽅式:
1.基本JDK动态代理实现
2.基于CGLIB动态代理实现.
运⾏时使⽤哪种⽅式与项⽬配置和代理的对象有关
标签:JDK,对象,Spring,代理,接口,实现,AOP,原理,动态 From: https://blog.csdn.net/jj666mhhh/article/details/143830230