淺析Java中的動(dòng)態(tài)代理_第1頁
淺析Java中的動(dòng)態(tài)代理_第2頁
淺析Java中的動(dòng)態(tài)代理_第3頁
淺析Java中的動(dòng)態(tài)代理_第4頁
淺析Java中的動(dòng)態(tài)代理_第5頁
已閱讀5頁,還剩1頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第淺析Java中的動(dòng)態(tài)代理目錄代理常見功能代理模式的組成代理模式分類動(dòng)態(tài)代理實(shí)現(xiàn)的技術(shù)JDK代理的實(shí)現(xiàn)步驟CGLIB代理實(shí)現(xiàn)步驟

代理常見功能

日志代理

數(shù)據(jù)庫訪問的事務(wù)代理

代理模式的組成

抽象主題:通過接口或抽象類定義核心業(yè)務(wù)方法。真實(shí)主題:實(shí)現(xiàn)了接口的實(shí)現(xiàn)類,是實(shí)施代理的具體對象。即代理最終代理的是具體的實(shí)現(xiàn)類類而不是接口。代理:具有與代理對象相同的方法,可以控制和擴(kuò)展被代理對象的功能,也是使用代理對象的根據(jù)目的。

代理對象=增強(qiáng)代碼+目標(biāo)對象(原對象)

代理模式分類

靜態(tài)代理:代理類與被代理類一一對應(yīng),缺點(diǎn)是代理類太多。

動(dòng)態(tài)代理:代理類是運(yùn)行時(shí)通過反射技術(shù)動(dòng)態(tài)生成的。有點(diǎn)是一類相似功能的被代理類(即需要相同擴(kuò)展功能的類)只需要一個(gè)動(dòng)態(tài)代理類。

動(dòng)態(tài)代理實(shí)現(xiàn)的技術(shù)

JDK代理:面向接口的代理,無法直接代理類,被代理的類必須實(shí)現(xiàn)某業(yè)務(wù)接口。

CGLIB代理:功能更強(qiáng),性能更好,可以直接代理類而不用實(shí)現(xiàn)接口,是通過動(dòng)態(tài)創(chuàng)建被代理的子類重寫父類的被代理方法來實(shí)現(xiàn)統(tǒng)計(jì)附件功能的。不能代理final類或final方法。

JDK代理的實(shí)現(xiàn)步驟

核心業(yè)務(wù)接口

publicinterfaceBuyer{

*賣房:核心業(yè)務(wù)方法

*@return

Stringbuy();

業(yè)務(wù)實(shí)現(xiàn)類

publicclassBuyerImplimplementsBuyer{

publicStringbuy(){

System.out.println("本人賣房,從不坑人...");

return"一次搞定";

動(dòng)態(tài)代理類

publicclassBuyerInvocationHandlerimplementsInvocationHandler{

//被代理對象

privateObjecttarget;

*設(shè)置被代理對象

*@paramtarget

publicvoidsetTarget(Objecttarget){

this.target=target;

*執(zhí)行被代理對象的業(yè)務(wù)方法的代理方法

*@paramproxy

*@parammethod

*@paramargs

*@return

*@throwsThrowable

publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{

System.out.println("熬夜?jié)M大街收集電話號碼.....");

//調(diào)用核心業(yè)務(wù)方法

Objectresult=method.invoke(target,args);

System.out.println("不滿意,再找我...");

returnresult;

代理工廠類

publicclassBuyerProxyFactory{

*工廠方法

*@paramtarget需要被代理的對象

*@paramT

*@return返回動(dòng)態(tài)生成的代理對象

publicstaticTTcreate(Objecttarget){

//創(chuàng)建動(dòng)態(tài)代理對象

BuyerInvocationHandlerhandler=newBuyerInvocationHandler();

//設(shè)置被代理對象

handler.setTarget(target);

//動(dòng)態(tài)創(chuàng)建執(zhí)行業(yè)務(wù)方法的代理對象

return(T)Proxy.newProxyInstance(

target.getClass().getClassLoader(),

target.getClass().getInterfaces(),

handler);

}

測試類

publicclassexample{

publicstaticvoidmain(String[]args){

//定義被代理對象

//定義被代理對象

Buyerbuyer=newBuyerImpl();

buyer.buy();//直接調(diào)用業(yè)務(wù)方法,沒有代理的功能

//使用代理工廠創(chuàng)建動(dòng)態(tài)代理類對象

BuyerproxyBuyer=BuyerProxyFactory.create(buyer);

proxyBuyer.buy();

CGLIB代理實(shí)現(xiàn)步驟

導(dǎo)入POM

dependency

groupIdcglib/groupId

artifactIdcglib-nodep/artifactId

version3.3.0/version

/dependency

定義業(yè)務(wù)方法

publicclassOrderService{

publicintinsert(){

System.out.println("添加訂單....");

return0;

定義代理工廠類,與提供事務(wù)控制功能的MethodInterceptor合二為一

publicclassTransactionProxyFactory{

*動(dòng)態(tài)創(chuàng)建被代理類的代理對象

*@paramclazz類型

*@paramT

*@return代理對象

publicstaticTTcreate(ClassTclazz){

Enhancerenhancer=newEnhancer();

//采用接口內(nèi)部類的方式實(shí)現(xiàn)代理功能

enhancer.setCallback(newMethodInterceptor(){

publicObjectintercept(Objecttarget,Methodmethod,Object[]objects,MethodProxymethodProxy)throwsThrowable{

System.out.println("開始事務(wù)。。。。");

//核心業(yè)務(wù),調(diào)用父類的方法

Objectresult=methodProxy.invokeSuper(target,objects);

System.out.println("提交或回滾事務(wù)....");

returnresult;

//設(shè)置代理類的父類

enhancer.setSuperclass(clazz);

//返回創(chuàng)建的動(dòng)態(tài)代理類對象

return(T)enhancer.create();

}

測試類

publicclassTransactionProxyFactoryTest{

publicstaticvoidmain(String[]args){

//使用代理創(chuàng)建業(yè)務(wù)邏輯類

OrderServiceorderService=

TransactionProxy

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論