昨天看了一天的代理方面的知识,刚开始看的时候没看出什么花头来,感受不实用。一大堆的东西,还不如直接new出来,而后调用方法。后来仔细研究了一下AOP(面向切面)的思想,才发现代理的用处实在太大了。如今不少框架包括Spring等,都用到了代理这方面的知识,什么是代理?引用网上的例子,就是一我的去买房子,能够直接去买房子,若是直接去买房子的话就得准备不少的东西,而后跑不少地方,这时候房产中介就出现了,咱们能够把买房子的事交给中介,让中介作咱们的代理,这样咱们会省力不少,不须要关心房子是怎么买下来的。这里先简单的描述一下三种代理的区别吧node
一、静态代理:静态代理中的代理类,须要咱们本身写。代码以下:框架
首先是接口类:代理
而后是委托类对象
最后是代理类:继承
固然,这里我把实现代理的过程写在代理类的main方法中了。从上面的代码中能够看出这个静态代理类,很是的笨。若是你想让这个代理类代理多个类的话,代码会愈来愈多。因此,这时候咱们就须要一个动态的代理类;接口
二、JDK动态代理类:io
JDK动态代理类实现了InvocationHandler接口。在重写的invoke方法中能够看出,JDK动态代理的基础是反射(method.invoke(对象,参数)),还好反射看的比较多,到如今还记得。在这里须要提到的是Proxy.newProxyInstance(),这个方法。字面上的意思是 新建一个代理类的实例,这一点就和静态代理不一样了。里面的参数有三个 类加载器、全部的接口,获得InvocationHandler接口的子类实例。这就是JDK动态代理,该代理有如下几种特色:基础
一、Interface:对于JDK Proxy,业务类是须要一个Interface的,这是一个缺陷;原理
二、Proxy:Proxy类是动态产生的,这个类在调用Proxy.newProxyInstance()方法以后,产生一个Proxy类的实力。实际上,这个Proxy类也是存在的,不单单是类的实例,这个Proxy类能够保存在硬盘上;引用
三、Method:对于业务委托类的每一个方法,如今Proxy类里面都不用静态显示出来
四、InvocationHandler:这个类在业务委托类执行时,会先调用invoke方法。invoke方法在执行想要的代理操做,能够实现对业务方法的再包装。
以上就是JDK动态代理
三、CGLib动态代理:上面的JDK Proxy只能代理实现了接口的类,而不能实现接口的类就不能实现JDK代理。这时候就须要CGLib动态代理类
这里须要注意的是实现MethodIntercetor接口,必须导入cglib-nodep-2.1_3.jar这个包。CGLib是针对类来实现代理的,他的原理是对指定的目标生成一个子类,并覆盖其中方法实现加强,但由于采用的是继承,因此不能对final修饰的类进行代理。