Spring的两种代理方式:JDK动态代理和CGLIB动态代理

代理模式

代理模式的英文叫作Proxy或Surrogate,中文均可译为”代理“,所谓代理,就是一我的或者一个机构表明另外一我的或者另外一个机构采起行动。在一些状况下,一个客户不想或者不可以直接引用一个对象,而代理对象能够在客户端和目标对象之间起到中介的做用
A. 抽象主题角色
声明了真实主题和代理主题的共同接口,这样一来在任何可使用真实主题的地方均可以是使用代理主题
B. 代理主题(Proxy)角色:
代理主题角色内部含有对真实主题的引用,从而能够在任什么时候候操做真实主题对象;代理主题角色提供一个与真实主题角色相同的接口,以即可以在任什么时候候均可以替代真实主题控制对真实主题的引用,负责在须要的时候建立真实主题对象(和删除真实主题对象);代理角色一般在将客户端调用传递给真实的主题以前或以后,都要执行某个操做,而不是单纯地将调用传递给真实主题对象。
C. 真实主题角色
定义了代理角色所表明地真实对象 java

 

 

 

 


例如: spring

 

 

 

 


用动态代理模式重构

 

 


JDK动态代理

 

 

 

目标类
拦截器
代理类性能

总结:一、由于利用JDKProxy生成的代理类实现了接口,因此目标类中全部的方法在代理类中都有。
二、生成的代理类的全部的方法都拦截了目标类的全部的方法。而拦截器中invoke方法的内容正好就是代理类的各个方法的组成体。
三、利用JDKProxy方式必须有接口的存在。
四、invoke方法中的三个参数能够访问目标类的被调用方法的API、被调用方法的参数、被调用方法的返回类型。.net

用JDK动态代理模式重构hibernate

 

 

用JDK动态代理模式重构hibernate事务3d

 

 

cglib动态代理

一、 CGlib是一个强大的,高性能,高质量的Code生成类库。它能够在运行期扩展Java类与实现Java接口。
二、 用CGlib生成代理类是目标类的子类。
三、 用CGlib生成 代理类不须要接口
四、 用CGLib生成的代理类重写了父类的各个方法。
五、 拦截器中的intercept方法内容正好就是代理类中的方法体代理

 

 

 

用cglib动态代理模式重构hibernate事务对象

 

spring两种代理方式

若目标对象实现了若干接口,spring使用JDK的java.lang.reflect.Proxy类代理。
优势:由于有接口,因此使系统更加松耦合
缺点:为每个目标类建立接口
若目标对象没有实现任何接口,spring使用CGLIB库生成目标对象的子类。
优势:由于代理类与目标类是继承关系,因此不须要有接口的存在。
缺点:由于没有使用接口,因此系统的耦合性没有使用JDK的动态代理好。

原文:https://blog.csdn.net/cckevincyh/article/details/54962920blog

相关文章
相关标签/搜索