1.静态代理和动态代理
- 什么是代理
为某⼀个对象创建⼀个代理对象,程序不直接⽤原本的对象,⽽是由创建的代理对象来控制对原对象,通过代理类这中间⼀层,能有效控制对委托类对象的直接访问,也可以很好地隐藏和保护委托类对象,同时也为实施不同控制策略预留了空间
A ->B-> C - 什么是静态代理
由程序创建或特定⼯具⾃动⽣成源代码,在程序运⾏前,代理类的.class⽂件就已经存在 - 什么是动态代理
在程序运⾏时,运⽤反射机制动态创建⽽成,⽆需⼿动编写代码
JDK动态代理 CGLIB动态代理
2.代理模式实战之静态代理
- 什么是静态代理
由程序创建或特定⼯具⾃动⽣成源代码,在程序运⾏前,代理类的.class⽂件就已经存在
通过将⽬标类与代理类实现同⼀个接⼝,让代理类持有真实类对象,然后在代理类⽅法中调⽤真实类⽅法,在调⽤真实类⽅法的前后添加我们所需要的功能扩展代码来达到增强的⽬的 - 优点
代理使客户端不需要知道实现类是什么,怎么做的,⽽客户端只需知道代理即可
⽅便增加功能,拓展业务逻辑 - 缺点
代理类中出现⼤量冗余的代码,⾮常不利于扩展和维护
如果接⼝增加⼀个⽅法,除了所有实现类需要实现这个⽅法外,所有代理类也需要实现此⽅法。增加了代码维护的复杂度
3.AOP的实现策略之JDK动态代理
- 什么是动态代理
在程序运⾏时,运⽤反射机制动态创建⽽成,⽆需⼿动编写代码
JDK动态代理与静态代理⼀样,⽬标类需要实现⼀个代理接⼝,再通过代理对象调⽤⽬标⽅法 - 实操
4.AOP的实现策略之CGLib动态代理
- 什么是动态代理
在程序运⾏时,运⽤反射机制动态创建⽽成,⽆需⼿动编写代码
CgLib动态代理的原理是对指定的业务类⽣成⼀个⼦类,并覆盖其中的业务⽅法来实现代理
5.CGLib动态代理和JDK动态代理总结
- 动态代理与静态代理相⽐较,最⼤的好处是接⼝中声明的所有⽅法都被转移到调⽤处理器⼀个集中的⽅法中处理,解耦和易维护
- 两种动态代理的区别
- JDK动态代理:要求⽬标对象实现⼀个接⼝,但是有时候⽬标对象只是⼀个单独的对象,并没有实现任何的接⼝,这个时候就可以⽤CGLib动态代理
- CGLib动态代理,它是在内存中构建⼀个⼦类对象从⽽实现对⽬标对象功能的扩展
- JDK动态代理是⾃带的,CGlib需要引⼊第三⽅包
- CGLib动态代理基于继承来实现代理,所以⽆法对final类、private⽅法和static⽅法实现代理
- Spring AOP中的代理使⽤的默认策略
- 如果⽬标对象实现了接⼝,则默认采⽤JDK动态代理
- 如果⽬标对象没有实现接⼝,则采⽤CgLib进⾏动态代理
- 如果⽬标对象实现了接扣,程序⾥⾯依旧可以指定使⽤CGlib动态代理