日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Spring AOP里的靜態(tài)代理和動態(tài)代理用法詳解

瀏覽:21日期:2023-08-24 17:56:49

什么是代理?

為某一個對象創(chuàng)建一個代理對象,程序不直接用原本的對象,而是由創(chuàng)建的代理對象來控制原對象,通過代理類這中間一層,能有效控制對委托類對象的直接訪問,也可以很好地隱藏和保護委托類對象,同時也為實施不同控制策略預留了空間

什么是靜態(tài)代理?

由程序創(chuàng)建或特定工具自動生成源代碼,在程序運行前,代理類的.class文件就已經(jīng)存在

通過將目標類與代理類實現(xiàn)同一個接口,讓代理類持有真實類對象,然后在代理類方法中調(diào)用真實類方法,在調(diào)用真實類方法的前后添加我們所需要的功能擴展代碼來達到增強的目的。

優(yōu)點

代理使客戶端不需要知道實現(xiàn)類是什么,怎么做,而客戶端只需知道代理即可 方便增加功能,擴展業(yè)務邏輯

缺點

代理類中常出現(xiàn)大量冗余的代碼,非常不利于擴展和維護 如果接口增加一個方法,除了所有實現(xiàn)類需要實現(xiàn)這個方法外,所有代理類也需要實現(xiàn)此方法。增加了代碼維護的復雜度

案例演示

PayService.java(接口)

package net.cybclass.sp.proxy;public interface PayService { /** * 支付回調(diào) * @param outTradeNo 訂單號 * @return */ String callback(String outTradeNo); /** * 下單 * @param userId 用戶id * @param productId 產(chǎn)品id * @return */ int save(int userId,int productId);}

PayServiceImpl.java(接口實現(xiàn)類)

package net.cybclass.sp.proxy;public class PayServiceImpl implements PayService{ public String callback(String outTradeNo) { System.out.println('目標類 PayServiceImpl 回調(diào) 方法 callback'); return outTradeNo; } public int save(int userId, int productId) { System.out.println('目標類 PayServiceImpl 回調(diào) 方法 save'); return productId; }}

StaticProxyPayServiceImpl.java(接口實現(xiàn)類,靜態(tài)代理)

package net.cybclass.sp.proxy;public class StaticProxyPayServiceImpl implements PayService{ private PayService payService; public StaticProxyPayServiceImpl(PayService payService) { this.payService=payService; } public String callback(String outTradeNo) { System.out.println('StaticProxyPayServiceImpl callback begin'); String result=payService.callback(outTradeNo); System.out.println('StaticProxyPayServiceImpl callback end'); return result; } public int save(int userId, int productId) { System.out.println('StaticProxyPayServiceImpl save begin'); int id = payService.save(userId, productId); System.out.println('StaticProxyPayServiceImpl save end'); return id; }}

演示

Spring AOP里的靜態(tài)代理和動態(tài)代理用法詳解

什么是動態(tài)代理?

在程序運行時,運用反射機制動態(tài)創(chuàng)建而成,無需手動編寫代碼

JDK動態(tài)代理

CGLIB動態(tài)代理(原理:是對指定的業(yè)務類生成一個子類,并覆蓋其中的業(yè)務方法來實現(xiàn)代理)

jdk動態(tài)代理演示

定義一個類,去實現(xiàn)InvocationHandler這個接口,并車從寫invoke方法//Object proxy:被代理的對象//Method method:要調(diào)用的方法//Object[] args:方法調(diào)用時所需要參數(shù)public Object invoke(Object proxy, Method method, Object[] args){}

PayService.java(接口)

package net.cybclass.sp.proxy;public interface PayService { /** * 支付回調(diào) * @param outTradeNo 訂單號 * @return */ String callback(String outTradeNo); /** * 下單 * @param userId 用戶id * @param productId 產(chǎn)品id * @return */ int save(int userId,int productId);}

PayServiceImpl.java(接口實現(xiàn)類)

package net.cybclass.sp.proxy;public class PayServiceImpl implements PayService{ public String callback(String outTradeNo) { System.out.println('目標類 PayServiceImpl 回調(diào) 方法 callback'); return outTradeNo; } public int save(int userId, int productId) { System.out.println('目標類 PayServiceImpl 回調(diào) 方法 save'); return productId; }}

JDKProxy.java(jdk動態(tài)代理類)

package net.cybclass.sp.proxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class JDKProxy implements InvocationHandler { //目標類 private Object targetObject; /** * 獲取代理對象 * @param targetObject 目標類 * @return */ public Object newProxyInstance(Object targetObject) { this.targetObject = targetObject; //綁定關(guān)系,也就是和具體的那個實現(xiàn)類關(guān)聯(lián) return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(), targetObject.getClass().getInterfaces(), this); } /** * JDK動態(tài)代理 * * @param proxy 靜態(tài)代理對象 * @param method 要調(diào)用的方法 * @param args 方法調(diào)用時所需要參數(shù) * @return * @throws Throwable */ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = null; try { System.out.println('通過JDK動態(tài)代理調(diào)用'+method.getName()+',打印日志 begin'); result = method.invoke(targetObject, args); System.out.println('通過JDK動態(tài)代理調(diào)用'+method.getName()+',打印日志 end'); } catch (Exception ex) { ex.printStackTrace(); } return result; }}

Spring AOP里的靜態(tài)代理和動態(tài)代理用法詳解

CGLIB動態(tài)代理演示

PayService.java(接口)

package net.cybclass.sp.proxy;public interface PayService { /** * 支付回調(diào) * @param outTradeNo 訂單號 * @return */ String callback(String outTradeNo); /** * 下單 * @param userId 用戶id * @param productId 產(chǎn)品id * @return */ int save(int userId,int productId);}

PayServiceImpl.java(接口實現(xiàn)類)

package net.cybclass.sp.proxy;public class PayServiceImpl implements PayService{ public String callback(String outTradeNo) { System.out.println('目標類 PayServiceImpl 回調(diào) 方法 callback'); return outTradeNo; } public int save(int userId, int productId) { System.out.println('目標類 PayServiceImpl 回調(diào) 方法 save'); return productId; }}

CGLIBProxy.java(CGLIB動態(tài)代理類)

package net.cybclass.sp.proxy;import org.springframework.cglib.proxy.Enhancer;import org.springframework.cglib.proxy.MethodInterceptor;import org.springframework.cglib.proxy.MethodProxy;import java.lang.reflect.Method;public class CGLIBProxy implements MethodInterceptor { //目標類 private Object targetObject; //綁定關(guān)系 public Object newProxyInstance(Object targetObject){ this.targetObject=targetObject; Enhancer enhancer=new Enhancer(); //設置代理類的父類(目標類) enhancer.setSuperclass(this.targetObject.getClass()); //設置回調(diào)函數(shù) enhancer.setCallback(this); //創(chuàng)建子類(代理對象) return enhancer.create(); } public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { Object result=null; try { System.out.println('通過CGLIB動態(tài)代理調(diào)用'+method.getName()+',打印日志 begin'); result=methodProxy.invokeSuper(o,args); System.out.println('通過CGLIB動態(tài)代理調(diào)用'+method.getName()+',打印日志 end'); } catch (Exception ex){ ex.printStackTrace(); } return result; }}

Spring AOP里的靜態(tài)代理和動態(tài)代理用法詳解

總結(jié)

動態(tài)代理與靜態(tài)代理相比較,最大的好處是接口中聲明的所有方法都被轉(zhuǎn)移到調(diào)用處理器一個集中的方法中處理,解耦和易維護。

兩種動態(tài)代理的區(qū)別

JDK動態(tài)代理:要求目標對象實現(xiàn)一個接口,但是有時候目標對象只是一個單獨的對象,并沒有實現(xiàn)任何的接口,這個時候就可以用CGLIB動態(tài)代理 JDK動態(tài)代理是自帶的,CGLIB需要引入第三方包 CGLIB動態(tài)代理,它是內(nèi)存中構(gòu)建一個子類對象從而實現(xiàn)對目標對象功能的擴展 CGLIB動態(tài)代理基于繼承來實現(xiàn)代理,所以無法對final類,private方法和static方法實現(xiàn)代理

Spring AOP中的代理使用的默認策略

如果目標對象實現(xiàn)類接口,則默認采用JDK動態(tài)代理 如果目標對象沒有實現(xiàn)接口,則采用CGLIB進行動態(tài)代理

到此這篇關(guān)于 Spring AOP里的靜態(tài)代理和動態(tài)代理用法詳解的文章就介紹到這了,更多相關(guān) Spring AOP 靜態(tài)代理 動態(tài)代理內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
模特精品在线| 水蜜桃精品av一区二区| 精品福利久久久| 久久香蕉精品香蕉| 久久久国产精品入口麻豆| 国产精品美女午夜爽爽| 国产精品videossex久久发布| 日韩影院在线观看| 婷婷综合电影| 美女久久99| 深夜视频一区二区| 久久电影一区| 日韩福利视频导航| 国产精品原创| 综合亚洲自拍| 国产一区国产二区国产三区| 国产伦久视频在线观看| 日韩午夜在线| 国产精品香蕉| 在线日韩av| 青草av.久久免费一区| 国产精品久久久久蜜臀 | 国产一区二区三区四区五区 | 国产v日韩v欧美v| 国产视频一区三区| 精品久久久网| 亚洲免费影视| 久久午夜影院| 亚洲一区欧美二区| 你懂的亚洲视频| 日韩午夜av| 美腿丝袜亚洲一区| 最新国产拍偷乱拍精品| 国产欧美高清| 激情丁香综合| 麻豆精品一区二区综合av| 好吊一区二区三区| 欧美极品中文字幕| 蜜桃av一区二区在线观看| 精品视频黄色| 欧美日韩一区二区三区四区在线观看 | 免费视频一区二区| 国产乱码精品一区二区三区四区 | 99riav1国产精品视频| 精品网站999| 日韩一区二区三区高清在线观看| 日韩av首页| 98精品久久久久久久| 欧美有码在线| 日韩欧美中文字幕一区二区三区| 欧美日韩国产亚洲一区| 蜜桃av.网站在线观看| 国产精品流白浆在线观看| 亚洲精品观看| 亚洲欧洲一区| 国产高清久久| 麻豆精品在线观看| 亚洲免费观看高清完整版在线观| 精品理论电影在线| 麻豆中文一区二区| 国产极品久久久久久久久波多结野| 亚洲综合国产| 亚洲综合电影一区二区三区| 日韩午夜电影| 久久亚洲二区| 亚洲永久精品唐人导航网址| 免费成人在线观看| 日韩一区网站| 国产乱人伦丫前精品视频| 亚洲久草在线| 综合欧美精品| 中文在线日韩| 日韩一区中文| 国产精品一级在线观看| 亚州国产精品| 欧美国产另类| 黄色网一区二区| 在线天堂资源www在线污| 日韩成人精品一区| 日韩在线第七页| 国产婷婷精品| 国产精品对白| 欧美精品一二| 欧美日一区二区三区在线观看国产免| 色综合视频一区二区三区日韩| 日韩欧美2区| 日韩.com| 蜜臀精品一区二区三区在线观看 | av资源新版天堂在线| aa亚洲婷婷| 九九久久国产| 欧美精品一区二区久久| 亚洲丝袜啪啪| 欧美成人aaa| 在线亚洲国产精品网站| 国产乱论精品| 亚洲欧美高清| 国产精品视频一区二区三区四蜜臂| 日韩精品一卡| 国产欧美一级| 99xxxx成人网| 亚洲啊v在线| 国产乱人伦丫前精品视频 | 亚洲精品美女| 免费成人网www| 久久精品国产免费| 五月精品视频| 欧美a级一区二区| 免费观看久久久4p| 亚洲啊v在线| 欧美韩一区二区| 日韩和欧美的一区| 亚洲一级在线| 欧美日韩亚洲在线观看| 精品三级在线观看视频| 亚洲精品伊人| 亚洲电影在线一区二区三区| 国产精品99视频| 欧美一区成人| 亚洲精品女人| 男人天堂欧美日韩| av免费不卡国产观看| 国产探花一区| 国产精品一区高清| 91欧美极品| 国产精品久久久久久久久免费高清 | 亚洲香蕉久久| 国产91精品对白在线播放| 久久亚州av| 福利一区在线| 老牛影视精品| 亚洲特色特黄| 日本蜜桃在线观看视频| 欧洲一级精品| 中文一区在线| 7777精品| 国产白浆在线免费观看| 99久久婷婷| 视频在线观看一区| 91免费精品国偷自产在线在线| 日韩国产91| 精品国产乱码久久久| 美女视频黄久久| 欧美亚洲日本精品| 影院欧美亚洲| 亚洲3区在线| 精品欠久久久中文字幕加勒比| 国产精品白浆| 亚洲精品888| 欧美日韩一区二区高清| 亚洲国产福利| 蜜臀国产一区二区三区在线播放| 国产亚洲精品美女久久 | 日韩精品久久理论片| 久久久久97| 午夜宅男久久久| 国产精品亚洲成在人线| 欧美成人高清| 你懂的亚洲视频| 蜜臀av一区二区三区| 欧美精品1区| 视频一区二区中文字幕| 亚洲精品福利电影| 日韩国产一区二| 亚洲午夜黄色| 精品九九久久| 制服诱惑一区二区| **爰片久久毛片| 91综合视频| 欧美亚洲专区| 日av在线不卡| jiujiure精品视频播放| 日韩成人精品一区二区| 视频一区中文字幕精品| 欧美日韩精品一区二区视频| 欧美一区二区三区久久| 好看的av在线不卡观看| 日韩在线高清| 精品成人18| 美女久久久久久| 欧美日本精品| 中文字幕日韩欧美精品高清在线| av中文字幕在线观看第一页| 国产欧美一区二区三区精品观看| 亚洲最新av| 只有精品亚洲| 久久夜色精品| 在线亚洲免费| 欧美一区=区| 蜜乳av另类精品一区二区| 日韩毛片在线| 久久久久亚洲| 色婷婷精品视频| 蜜桃国内精品久久久久软件9| 久久精品观看| 五月天综合网站| 久久xxxx| 啪啪亚洲精品| 精品成av人一区二区三区| 精品视频黄色|