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 动态代理。

  1. CGLIB可以代理那些没有实现接口的类,使得它更加灵活,可以代理更广泛的类。

  2. 执行速度:CGLIB在目标方法的执行速度上更快。这是因为CGLIB采用了一种称为FastClass的机制,它通过生成的代理类直接调用目标方法,避免了一些额外的方法调用,从而提高了执行效率。相比之下,JDK动态代理需要通过反射调用目标方法,会引入一些性能开销。

小结

CGLIB是一个用于生成代理类的开源库,它与JDK自带的动态代理在一些方面有所不同,主要体现在以下几点:

  1. 接口要求:JDK动态代理要求被代理的类实现某个接口,而CGLIB则没有这个限制。CGLIB可以代理那些没有实现接口的类,使得它更加灵活,可以代理更广泛的类。

  2. 执行速度: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

cglib动态代理的使用和分析

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章