Java入门(18)静态代理和动态代理
序言
1.什么是静态代理和动态代理
2.为什么需要静态代理和动态代理?使用场景
3.demo演示静态代理和动态代理
4.静态代理存在的问题?
5.JDK动态代理:存在的问题?
6.cglib动态代理:cglib是什么?常见的动态代理?为什么要用动态代理?
7.what why how
静态代理
静态就是说我们的代理类都在程序员编码阶段就已经实现了,通过编译器后可以直接编译成class文件然后加载到JVM内存,程序运行时,class就已经存在了。
demo演示静态代理如何实现
静态代理存在的问题:
静态代理解决了代码耦合的问题,但也带来了新的挑战:需要手动创建和维护大量的代理类。每个控制器都需要增加一个代理类,这意味着在项目中会有许多*Proxy类存在。
此外,当RoleController添加新的方法时,还需要在相应的代理类中进行实现。在这种情况下,我们会想,如果代理类能够自动生成就太好了。于是,动态代理就应运而生。
动态代理-JDK动态代理
JDK动态代理的问题
JDK动态代理要求被代理的类实现某个接口,而CGLIB则没有这个限制。
动态代理-CGLib动态代理
那既然有了JDK动态代理,为什么还需要cglib动态代理?
因为JDK动态代理必须要绑定接口(这是一个缺陷,cglib弥补了这一缺陷)
下面就说一下 cglib 动态代理。
-
CGLIB可以代理那些没有实现接口的类,使得它更加灵活,可以代理更广泛的类。
-
执行速度:CGLIB在目标方法的执行速度上更快。这是因为CGLIB采用了一种称为FastClass的机制,它通过生成的代理类直接调用目标方法,避免了一些额外的方法调用,从而提高了执行效率。相比之下,JDK动态代理需要通过反射调用目标方法,会引入一些性能开销。
小结
CGLIB是一个用于生成代理类的开源库,它与JDK自带的动态代理在一些方面有所不同,主要体现在以下几点:
-
接口要求:JDK动态代理要求被代理的类实现某个接口,而CGLIB则没有这个限制。CGLIB可以代理那些没有实现接口的类,使得它更加灵活,可以代理更广泛的类。
-
执行速度:CGLIB在目标方法的执行速度上更快。这是因为CGLIB采用了一种称为FastClass的机制,它通过生成的代理类直接调用目标方法,避免了一些额外的方法调用,从而提高了执行效率。相比之下,JDK动态代理需要通过反射调用目标方法,会引入一些性能开销。
需要注意的是,CGLIB通过生成继承自目标类的子类来实现代理,因此目标类和目标方法不能被声明为final,否则CGLIB无法生成代理类。
常见的动态代理
在代理类库中,我们经常接触到的是JDK动态代理和前文提到的CGLIB。这两个类库都能在运行时生成代理类,并被广泛应用于Spring的AOP(面向切面编程)中。
除了JDK动态代理和CGLIB之外,还存在其他一些第三方类库,如Javassist和AspectJ,它们不仅可以在运行时生成代理类,还可以在编译时生成代理类。这些类库提供了更多的灵活性和功能,但在本文中不作深入讨论。
Spring框架的AOP模块在实现上使用了JDK动态代理和CGLIB两种技术。对于实现了接口的类,Spring默认使用JDK动态代理来生成代理类;而对于没有实现接口的类,Spring会使用CGLIB来生成代理类。这样,Spring能够根据目标类的特性选择最合适的代理方式。
AspectJ
AspectJ是目前作为 AOP (Aspect-Oriented Programming 面向切面编程) 实现的一种最有效的解决方案。
为什么要用动态代理
资料
https://www.cnblogs.com/cosimo/p/17938521