成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

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

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

瀏覽:5日期: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)文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
成人app网站| 久久精子c满五个校花| 欧美日韩大陆一区二区| 国产精品女上位| 国产伦理精品不卡| 一本久道久久久| 久久蜜桃av一区二区天堂| 久久精品国产免费看久久精品| 亚洲第一黄网| 久久视频一区二区| 国产在线不卡视频| 久久久999| 自拍偷拍亚洲欧美日韩| 成人激情综合网站| 精品视频在线视频| 亚洲日本va午夜在线电影| 九九国产精品视频| 久久性色av| 一区二区三区视频在线看| 97久久精品人人爽人人爽蜜臀| 欧美日韩一区小说| 一级日本不卡的影视| 国产主播一区二区三区四区| 久久综合色婷婷| 国产精品资源站在线| 久久综合伊人| 亚洲中国最大av网站| 黑人一区二区三区四区五区| 日韩免费在线观看| 黑人巨大精品欧美一区| 免费久久99精品国产自| 亚洲乱码精品一二三四区日韩在线| 成人app在线| 欧美精品第1页| 免费看欧美女人艹b| 蜜桃av综合| 一区二区三区不卡视频在线观看| 欧美在线免费| 日韩欧美电影一区| 精品一区二区在线免费观看| 久久精品国产清高在天天线 | 日韩av午夜在线观看| 国产精品美女诱惑| 亚洲一区二区三区四区的 | 欧美自拍偷拍午夜视频| 五月激情综合网| 欧美中日韩免费视频| 亚洲在线观看免费| 亚洲一区在线直播| 亚洲一区二区视频| 亚洲精品123区| 国产精品久久一卡二卡| 国内激情久久| 综合电影一区二区三区| 99热精品国产| 国产午夜亚洲精品理论片色戒| 不卡一区二区三区四区| 精品国产乱子伦一区| 99久久精品国产一区| 国产亚洲综合av| 91丨九色porny丨蝌蚪| 国产三级欧美三级日产三级99 | 亚洲综合在线第一页| 午夜一级久久| 亚洲午夜私人影院| 久久国产日韩| 在线91免费看| 91麻豆精东视频| 一区二区三区高清| 欧美日韩免费一区二区三区视频| www.亚洲人| 一区二区三区日韩精品| 欧美另类z0zxhd电影| 精品999日本| 韩国v欧美v亚洲v日本v| 国产精品你懂的| 在线视频你懂得一区| 97久久精品人人做人人爽| 亚洲欧美日韩国产中文在线| 欧美午夜精品一区二区三区 | 亚洲第一黄色| 久久国产乱子精品免费女| 国产丝袜在线精品| 色婷婷久久综合| 91一区一区三区| 午夜精品在线视频一区| www成人在线观看| 久久国产88| 91网址在线看| 美女任你摸久久| 国产精品美日韩| 91精品一区二区三区久久久久久| 亚洲国产精选| 国产成人高清视频| 亚洲一区二区黄色| 精品国产一区二区三区久久久蜜月| 一区二区免费在线视频| 国产成人免费视频| 亚洲国产精品久久久久婷婷884| 精品乱人伦小说| 色综合久久天天| 欧美二区不卡| 国产一区二区精品在线观看| 亚洲精品日产精品乱码不卡| 欧美成人综合网站| 一本一道久久a久久精品综合蜜臀| 欧美fxxxxxx另类| 麻豆91在线播放| 一区二区三区四区国产精品| 久久免费电影网| 欧美福利视频导航| 久久av一区| 亚洲一级黄色| 成人高清免费在线播放| 青青青爽久久午夜综合久久午夜| 国产精品久久久久久久久晋中| 91麻豆精品国产91久久久更新时间| 国产欧美91| 欧美一区三区二区在线观看| 精品一区二区三区在线视频| 一区二区免费看| 中文字幕不卡在线播放| 7777精品伊人久久久大香线蕉完整版| 一区二区三区四区五区在线 | 亚洲高清激情| 波多野结衣精品在线| 麻豆国产精品官网| 亚洲亚洲人成综合网络| 欧美国产精品久久| 精品少妇一区二区三区免费观看| 久久久亚洲人| 在线亚洲观看| 欧美1区2区视频| 国产91精品久久久久久久网曝门| 石原莉奈在线亚洲二区| 国产精品国产三级国产普通话99 | 欧美精品午夜| 国产精品69毛片高清亚洲| 天天综合色天天综合| 亚洲欧美另类久久久精品| 国产香蕉久久精品综合网| 欧美变态凌虐bdsm| 欧美日韩国产高清一区二区| 国产精品乱码| 亚洲精品男同| 韩国av一区| 欧美激情视频一区二区三区免费| 国产一区二区三区四区五区入口 | 成人av动漫网站| 国产老肥熟一区二区三区| 日本伊人午夜精品| 亚洲高清在线精品| 一区二区三区精品久久久| 最新日韩在线视频| 国产精品国产三级国产有无不卡| 久久亚区不卡日本| 精品久久久久一区二区国产| 5月丁香婷婷综合| 欧美私模裸体表演在线观看| 色欧美乱欧美15图片| 媚黑女一区二区| 性欧美长视频| 性欧美精品高清| 久久亚洲综合网| 日本丰满少妇一区二区三区| 久久久国产精品一区二区中文 | 国产精品一区免费视频| 久久电影网电视剧免费观看| 蜜臀av在线播放一区二区三区| 日本va欧美va精品发布| 青青草国产精品97视觉盛宴| 日韩av网站在线观看| 秋霞国产午夜精品免费视频| 奇米在线7777在线精品 | 亚洲激情另类| 亚洲欧洲视频| 亚洲美女色禁图| 国产精品久久波多野结衣| 国产精品老牛| 久久精品一区二区三区中文字幕| 国产伦精品一区二区三区视频孕妇| 在线亚洲一区| 久久人人97超碰国产公开结果| 日本高清不卡视频| 欧美三级视频在线播放| 69久久99精品久久久久婷婷| 91精品国产综合久久香蕉麻豆| 日韩一区二区三区免费看| 日韩一区二区免费在线电影| 欧美va在线播放| 久久久久久久久久美女| 日本一区二区三级电影在线观看| 国产女同互慰高潮91漫画| 最新热久久免费视频| 亚洲综合一区二区三区| 五月婷婷综合在线| 久久99精品国产91久久来源| 国产91富婆露脸刺激对白| 欧美一区二区三区久久精品茉莉花 | 亚洲欧美精品|