代理模式 、JDK动态代理、cglib动态代理
生活随笔
收集整理的這篇文章主要介紹了
代理模式 、JDK动态代理、cglib动态代理
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
代理模式就是多一個代理類出來,替原對象進行一些操作,比如我們在租房子的時候回去找中介,為什么呢?
因為你對該地區房屋的信息掌握的不夠全面,希望找一個更熟悉的人去幫你做,此處的代理就是這個意思。
再如我們有的時候打官司,我們需要請律師,因為律師在法律方面有專長,可以替我們進行操作,表達我們的
想法。public interface Sourceable { public void method();
} public?class?Source?implements?Sourceable?{??@Override??public?void?method()?{??System.out.println("the?original?method!");??}??
} ?public?class?Proxy?implements?Sourceable?{??private?Source?source;??public?Proxy(){??super();??this.source?=?new?Source();??}??@Override??public?void?method()?{??before();??source.method();??atfer();??}??private?void?atfer()?{??System.out.println("after?proxy!");??}??private?void?before()?{??System.out.println("before?proxy!");??}??
}public?class?ProxyTest?{??public?static?void?main(String[]?args)?{??Sourceable?source?=?new?Proxy();??source.method();??}??} ?輸出:before proxy!
the original method!
after proxy!
代理模式的應用場景:
如果已有的方法在使用的時候需要對原有的方法進行改進,此時有兩種辦法:
1、修改原有的方法來適應。這樣違反了“對擴展開放,對修改關閉”的原則。
2、就是采用一個代理類調用原有的方法,且對產生的結果進行控制。這種方法就是代理模式。
使用代理模式,可以將功能劃分的更加清晰,有助于后期維護!jdk動態代理
特點:只能對實現了接口的類生產代理,不能針對類定義接口
/**?*?創建業務接口,包含業務可以提供對外的接口?*?*/??
public?interface?UserService{??/**?*?目標方法??*/??public?void?add();??
}??定義實現類
/**?*?創建業務接口實現類?*?*/??
public?class?UserServiceImpl?implements?UserService{??@Override??public?void?add()?{??System.out.println("----------add----------");??}??
}?定義代理
/**?*?自定義簡單的Invocation,對接口提供的方法進行增強?*??*?@author?Fighter?*?@date?2016-04-19?*/??
public?class?MyInvocationHandler?implements?InvocationHandler?{??//目標對象 private Object target; /**?*?構造方法?*?@param?target?目標對象?*/??public?MyInvocationHandler(Object?target)?{??super();??this.target=target;??}??*?執行目標對象的方法??*/??public?Object?invoke(Object?proxy,?Method?method,?Object[]?args)??throws?Throwable?{??//在目標方法執行前簡單打印一下??System.out.println("----------before----------");??//執行目標方法對象??Object?result=method.invoke(target,?args);??//在目標方法執行之后簡單打印一下??System.out.println("----------after----------");??return?result;??}??/**?*?獲取目標對象的代理對象?*?@return?代理對象?*?this.target.getClass().getInterfaces()//獲取被代理對象實現的所有接口*/??public?Object?getProxy(){??return?Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),???this.target.getClass().getInterfaces(),this);??}??}jdk動態代理測試public?class?ProxyTest{??@Test??public?void?testProxy()?throws?Throwable{??//實例化目標對象??UserService?userService=new?UserServiceImpl();??//實例化Invocation??MyInvocationHandler?invocationHandler=new?MyInvocationHandler(userService);??//根據目標生成代理對象??UserService?proxy=(UserService)invocationHandler.getProxy();??//調用代理對象方法??proxy.add();??}??
}?CGLIB動態代理示例
DK的動態代理機制只能代理實現了接口的類,而不能實現接口的類就不能實現JDK的動態代理,cglib是針對
類來實現代理的,他的原理是對指定的目標類生成一個子類,并覆蓋其中方法實現增強,但因為采用的是
繼承,所以不能對final修飾的類進行代理。?CGLIB是一個強大的高性能的代碼生成包。定義實現類
/**??*?這個是沒有實現接口的實現類???*???*/????
public?class?BookFacadeImpl?{????public?void?addBook()?{????System.out.println("增加圖書的普通方法...");????}????
}??/**??*?使用cglib動態代理??*???*/????
public?class?BookFacadeCglib?implements?MethodInterceptor?{????private?Object?target;????/**??*?創建代理對象??*???*?@param?target??*?@return??*/????public?Object?getInstance(Object?target)?{????this.target?=?target;????Enhancer?enhancer?=?new?Enhancer();????enhancer.setSuperclass(this.target.getClass());????//?回調方法????enhancer.setCallback(this);????//?創建代理對象????return?enhancer.create();????}????@Override????//?回調方法????public?Object?intercept(Object?obj,?Method?method,?Object[]?args,????MethodProxy?proxy)?throws?Throwable?{????System.out.println("事物開始");????proxy.invokeSuper(obj,?args);????System.out.println("事物結束");????return?null;????}????}?public?class?TestCglib?{????public?static?void?main(String[]?args)?{????BookFacadeCglib?cglib=new?BookFacadeCglib();????BookFacadeImpl?bookCglib=(BookFacadeImpl)cglib.getInstance(new?BookFacadeImpl());????bookCglib.addBook();????}????
}總結
CGLib創建的動態代理對象性能比JDK創建的動態代理對象的性能高不少,但是CGLib在創建代理對象時所
花費的時間卻比JDK多得多,所以對于單例的對象,因為無需頻繁創建對象,用CGLib合適,反之,使用JDK
方式要更為合適一些。同時,由于CGLib由于是采用動態創建子類的方法,對于final方法,無法進行代理。
?
總結
以上是生活随笔為你收集整理的代理模式 、JDK动态代理、cglib动态代理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring 整合 RocketMQ
- 下一篇: 什么是设计模式(Design Patte