什么是代理
所谓代理,也即是在实现委托类的功能的前提下,代理类增加特有的功能
代理实现方式之静态代理
静态代理
静态代理是由程序员自己创建的事实存在的代理类,因此在程序运行前就已经存在了,其缺点也十分明显:大量的静态代理,会使得类的规模庞杂,难于维护。
组成部分
Service接口--用于定义业务
ServiceImp类--实现具体业务
Proxy类--代理类,调用ServiceImp实现具体业务,并且调用自己的业务
静态代理
动态代理---JDK(通过接口)
实现原理
获取ServiceImp上的所有接口
动态创建Proxy类的字节码并且转换为class
创建InvocationHandler的实例以处理Proxy所有方法调用
Proxy以创建的InvocationHandler对象为参数实例化一个Proxy
InvocationHandler的存在意义:不同于静态代理,对于每个接口方法都重写,然后去调用具体实现类中的方法,而是将所有的方法都交给了InvocationHandler管理,让其调用具体实现类的对应业务方法,所以JDK实现动态代理的缺点也很明显,只能代理接口定义的方法。
jdk实现动态代理
动态代理---Cglib
实现原理
查找委托类上所有非final的public方法
将获取方法转换成对应的字节码,组合并且生成对应的class
通过实现MethodInterceptor接口来处理proxy上对应的所有业务方法,MethodInterceptor作用类似InvocationHandler
cglib实现动态代理
比较
JDK通过接口中的方法名,在动态生成的代理类中调用业务实现类的同名方法来进行代理;
CGlib通过继承业务类,生成的动态代理类是业务类的子类,通过重写业务方法进行代理,因此无法代理final方法;
CGLib创建的动态代理对象性能比JDK创建的动态代理对象的性能高不少,但是CGLib在创建代理对象时所花费的时间却比JDK多得多,所以对于单例的对象,因为无需频繁创建对象,用CGLib合适,反之,使用JDK方式要更为合适一些。
更多山东IT培训相关资讯,请扫描下方二维码