码迷,mamicode.com
首页 > 编程语言 > 详细

Spring Aop

时间:2018-08-09 12:13:21      阅读:194      评论:0      收藏:0      [点我收藏+]

标签:handle   code   实测   public   字节码   and   obj   代理技术   width   

转自:http://www.cnblogs.com/yulinfeng/p/7811965.html

在正式进入Spring AOP的源码实现前,我们需要准备一定的基础也就是面向切面编程的核心——动态代理。

JDK提供:

  • 基于反射,效率低
  • 只能代理实现了接口的目标对象

CGLIB:

  • 不需要目标对象实现接口
  • 基于字节码实现
  • 不能代理final方法(它的动态代理实际是生成目标对象的子类)

从Proxy.newProxyInstance开始,来研究JDK是如何生成代理类的。

public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)

该方法有3个参数,了解JVM类加载的可能知道确定为同一个类需要有2个条件:

  • 类的全限定名称相同

  • 加载类的类加载器相同

  要想生成目标对象的代理首先就要确保其类加载器相同,所以需要将目标对象的类加载器作为参数传递;其次JDK动态代理技术需要代理类和目标对象都继承自同一接口,所以需要将目标对象的接口作为参数传递;最后,传递InvocationHandler,这是主角,因为我们对目标对象的增强逻辑在这个实现类中,传递该对象使得代理类能够对其进行调用。

  在Proxy.newProxyInstance方法中创建代理类的过程主要有3步:

技术分享图片

在开头提到了CGLib的性能比JDK高,这实际上并不准确。或许这在特别条件下的确如此,因为在我实测发现JDK8的动态代理效率非常高,甚至略高于CGLib,但是在JDK6的环境下的效率就显得比较低了。所以,通常所说的CGLib性能比JDK动态代理要高,是传统的挂念,实际上Java一直都在不断优化动态代理性能,在比较高版本的JDK条件下可以放行大胆的使用JDK原生的动态代理。

Spring Aop

标签:handle   code   实测   public   字节码   and   obj   代理技术   width   

原文地址:https://www.cnblogs.com/jiataoq/p/9447891.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!