




版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 離職后的社會(huì)保險(xiǎn)處理協(xié)議
- 綠色政務(wù)協(xié)議
- 小學(xué)生傳銷預(yù)防教育主題班會(huì)
- 星巴克店面設(shè)計(jì)與布局
- 寬容心理健康課件
- 科技教育機(jī)構(gòu)疫情后項(xiàng)目實(shí)施計(jì)劃
- 小學(xué)語文德育主題閱讀活動(dòng)計(jì)劃
- 混凝土試塊留置與試驗(yàn)計(jì)劃
- 杯子創(chuàng)新設(shè)計(jì)方案
- 提升小學(xué)學(xué)生語言文字能力的計(jì)劃
- 電力增容項(xiàng)目施工組織設(shè)計(jì)
- 消防安全應(yīng)急照明設(shè)計(jì)方案
- 2024年河北省中職高考對口升學(xué)考試語文試卷真題(打印版)
- 2022版ISO27001信息安全管理體系基礎(chǔ)培訓(xùn)課件
- 教師個(gè)人成長檔案電子模板
- 《連續(xù)性腎替代治療容量評估與管理專家共識》解讀課件
- 德意莎門窗授權(quán)經(jīng)銷商合作協(xié)議書(代理商合作協(xié)議空白版)
- 大國兵器學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- DB35T 2212-2024消防遠(yuǎn)程監(jiān)控系統(tǒng)技術(shù)要求
- 班級音樂會(huì)主題班會(huì)
- 東亞飛蝗標(biāo)準(zhǔn)化養(yǎng)殖示范基地建設(shè)項(xiàng)目可行性實(shí)施報(bào)告
評論
0/150
提交評論