毕业论文
您现在的位置: 框架 >> 框架优势 >> 正文 >> 正文

Spring框架面试题之Spring框架

来源:框架 时间:2022/9/12
新媒体短视频运营求职招聘QQ群 http://cgia.cn/news/chuangyi/1592773.html

想要知道AOP采用哪种代理模式,首先要知道什么是动态代理模式?

动态代理模式常见的实现方式分别是JDK动态代理和CGLIB动态代理两种方式。

那么什么是动态代理?其实就是在操作时创建一个代理对象,来帮目标类完成一些事情。

比如说目标类可以认作为厨师王二麻,王二麻能够具体实现接口的所有功能,这个时候老板让王二麻做饭,当AOP代理的时候,会根据王二麻所实现的接口,再创建一个王二麻的代理对象作为王二麻的分身,这时候代理对象王二麻的分身就可以在王二麻做饭之前把菜给洗干净了,然后王二麻本人来做饭。但是在调用者老板看来,自始至终都是王二麻这个目标类一个人在洗菜做饭。

但是王二麻目标类知道,在他动手做饭之前他的代理对象帮他做了一些事情,代理对象也可以在他做饭之后帮他洗碗等等。

所以在java中,我们需要创建代理类来代替王二麻分身的作用,我们有需求直接去寻找代理类,而不需要访问原来的类。Spring为业务类创建一个代理类,我们把业务流程中通用的步骤抽取成切面放在代理类中,这就是Spring中AOP的实现原理。

在java的代理模式中有两种类型,分别是静态代理和动态代理,而Spring的AOP采用的动态代理模式。

JDK动态代理的核心是java.lang.reflect包下面的Proxy类和InvocationHandler接口,可以通过实现InvocationHandler接口定义横切逻辑,并通过反射机制调用目标类的代码,动态的将横切逻辑和业务逻辑编织在一起。

要用JDK动态代理的话,需要被代理的目标对象实现了至少一个接口,而对于没有通过接口定义业务方法的类,如何创建动态代理实例呢?答案当然是CGLIB。

那么CGLIB是怎么实现动态代理的呢?

CGLib全称是:CodeGenerationLibrary,实现原理类似于JDK动态代理,只是它在运行期间生成的代理对象是针对目标类扩展的子类。底层是依靠ASM操作字节码实现的,性能比JDK强。

两者对比:

  JDK动态代理是面向接口的。

  CGLib动态代理是通过字节码底层继承要代理类来实现。注意:cglib代理不能覆盖final方法。

所以Spring的AOP采用的是混合使用,如果被代理对象实现了接口,就优先使用JDK代理,如果没有实现接口,那么就使用cglib代理。

转载请注明:http://www.0431gb208.com/sjszjzl/1734.html

  • 上一篇文章:
  • 下一篇文章: 没有了