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

您的位置:首頁技術文章
文章詳情頁

Spring AOP里的靜態代理和動態代理用法詳解

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

什么是代理?

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

什么是靜態代理?

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

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

優點

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

缺點

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

案例演示

PayService.java(接口)

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

PayServiceImpl.java(接口實現類)

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

StaticProxyPayServiceImpl.java(接口實現類,靜態代理)

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里的靜態代理和動態代理用法詳解

什么是動態代理?

在程序運行時,運用反射機制動態創建而成,無需手動編寫代碼

JDK動態代理

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

jdk動態代理演示

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

PayService.java(接口)

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

PayServiceImpl.java(接口實現類)

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

JDKProxy.java(jdk動態代理類)

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; //綁定關系,也就是和具體的那個實現類關聯 return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(), targetObject.getClass().getInterfaces(), this); } /** * JDK動態代理 * * @param proxy 靜態代理對象 * @param method 要調用的方法 * @param args 方法調用時所需要參數 * @return * @throws Throwable */ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = null; try { System.out.println('通過JDK動態代理調用'+method.getName()+',打印日志 begin'); result = method.invoke(targetObject, args); System.out.println('通過JDK動態代理調用'+method.getName()+',打印日志 end'); } catch (Exception ex) { ex.printStackTrace(); } return result; }}

Spring AOP里的靜態代理和動態代理用法詳解

CGLIB動態代理演示

PayService.java(接口)

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

PayServiceImpl.java(接口實現類)

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

CGLIBProxy.java(CGLIB動態代理類)

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; //綁定關系 public Object newProxyInstance(Object targetObject){ this.targetObject=targetObject; Enhancer enhancer=new Enhancer(); //設置代理類的父類(目標類) enhancer.setSuperclass(this.targetObject.getClass()); //設置回調函數 enhancer.setCallback(this); //創建子類(代理對象) return enhancer.create(); } public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { Object result=null; try { System.out.println('通過CGLIB動態代理調用'+method.getName()+',打印日志 begin'); result=methodProxy.invokeSuper(o,args); System.out.println('通過CGLIB動態代理調用'+method.getName()+',打印日志 end'); } catch (Exception ex){ ex.printStackTrace(); } return result; }}

Spring AOP里的靜態代理和動態代理用法詳解

總結

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

兩種動態代理的區別

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

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

如果目標對象實現類接口,則默認采用JDK動態代理 如果目標對象沒有實現接口,則采用CGLIB進行動態代理

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

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美影院三区| 精品久久97| 婷婷亚洲五月色综合| 欧美~级网站不卡| 欧美日韩国产一区精品一区| 亚洲欧美网站| 国产精品人人爽人人做我的可爱| 天堂成人国产精品一区| 日韩视频一二区| 精品国产一区二| 成人久久久久| 欧美中文日韩| 国产日韩一区二区三区在线播放| 精品网站aaa| 91成人网在线观看| 日本免费一区二区视频| 成人午夜毛片| 一本一本久久| 国产精品videossex久久发布| 成人国产精品一区二区免费麻豆| 美女网站视频一区| 午夜一级久久| 国产精品tv| 欧美精品黄色| 日韩av成人高清| 亚洲一级少妇| 日韩久久一区| 久久人人精品| 日韩av在线免费观看不卡| 亚洲美女久久精品| 日韩在线一二三区| 麻豆视频一区二区| 亚洲午夜精品久久久久久app| 婷婷亚洲成人| 九九九精品视频| 久久亚洲欧美| 久久精品国产久精国产爱| 激情久久久久久| 欧美亚洲三区| 性欧美69xoxoxoxo| 国内在线观看一区二区三区| 视频一区二区三区中文字幕| 精品久久99| 中文字幕免费一区二区| 国产精品国产一区| 日韩国产一区二| 久久国产精品成人免费观看的软件| 亚洲精一区二区三区| 成人va天堂| 国产精品视频一区二区三区| 在线午夜精品| 91免费精品| 91成人精品在线| 精品一区在线| 国产一区二区三区精品在线观看| 中文一区一区三区免费在线观 | 国产剧情在线观看一区| 亚洲成人一区| 福利一区在线| 91精品丝袜国产高跟在线| 亚洲香蕉网站| 中文字幕在线看片| 国产麻豆一区二区三区| 欧美日韩四区| 91精品精品| 中文在线а√天堂| 国产一区三区在线播放| 欧美亚洲三级| 四虎在线精品| 奶水喷射视频一区| 偷拍欧美精品| 91tv亚洲精品香蕉国产一区| 欧美激情久久久久久久久久久| 亚洲视频二区| 水野朝阳av一区二区三区| 精品捆绑调教一区二区三区| 丁香婷婷久久| 精品一区视频| 美腿丝袜在线亚洲一区| 无码日韩精品一区二区免费| 蜜臀久久99精品久久久久久9| 久久中文字幕二区| 国产 日韩 欧美一区| 精品福利久久久| 久久精品天堂| 国产精品成人a在线观看| 久久精品国产99国产| 国产精品chinese| 久久国际精品| 国产精品夜夜夜| 日韩福利视频网| 青青青国产精品| 国产精品v亚洲精品v日韩精品| 国产精品视频一区二区三区| 欧美1区二区| 国产成人在线中文字幕| 日韩欧美精品一区| 亚洲一级黄色| 久久午夜精品一区二区| 中文字幕av一区二区三区人| 亚洲三级国产| 国产精一区二区| 国产成人精品亚洲线观看| 在线天堂资源www在线污| 欧美国产小视频| 97精品在线| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 国产精品久久久久久久久免费高清| 日本不卡高清| 欧美偷窥清纯综合图区| 国产精品jk白丝蜜臀av小说| 精品一级视频| 欧美一区二区三区激情视频| 亚洲精品97| 免费日韩一区二区| 亚洲aa在线| 麻豆精品视频在线观看视频| 国产va在线视频| 午夜久久影院| 欧美精品国产| 亚洲天堂资源| 国产精品呻吟| 欧美中文高清| av最新在线| 久久国产精品99国产| 日本久久二区| 国产精品13p| 亚洲综合欧美| 美女免费视频一区| www成人在线视频| 亚洲日本久久| 国产中文欧美日韩在线| 在线成人直播| 国产精品巨作av| 久久精品国产99久久| 免费久久精品视频| 久久精品一区二区国产| 日韩不卡在线| 日韩有吗在线观看| 在线天堂中文资源最新版| 美女国产精品| 风间由美中文字幕在线看视频国产欧美| 激情偷拍久久| 国产亚洲久久| 色88888久久久久久影院| 亚洲精品乱码| 久久电影tv| 日韩国产在线一| 激情欧美一区| 免费在线日韩av| 日韩中文字幕91| 日本免费久久| 久久激五月天综合精品| 一区三区视频| 国产成人在线中文字幕| 中文字幕成人| 欧美/亚洲一区| 久久99国产精品视频| 亚洲欧美激情诱惑| 国产一区调教| 日韩av一区二区在线影视| 激情久久久久久| 精品国产aⅴ| 日本h片久久| 久久夜色精品| 亚洲91精品| 精品精品久久| 国产亚洲一区二区三区啪| 悠悠资源网久久精品| 国产一区二区三区四区大秀| 日韩一区二区三区免费视频| 99精品视频在线| 久久超级碰碰| 日韩手机在线| 欧美日韩国产综合网| 国产欧洲在线| 麻豆国产一区| 欧美私人啪啪vps| 一区二区精品| 伊人久久亚洲热| 999久久久精品国产| 久久午夜影院| 国产精品欧美三级在线观看| 四虎精品永久免费| 在线看片一区| 亚洲欧美日本国产专区一区| 日韩在线综合| 欧美国产小视频| 精品精品99| 国产精品国码视频| 奇米狠狠一区二区三区| 蜜桃视频第一区免费观看| 亚洲激情久久| 五月天久久777| 日韩精品欧美激情一区二区| 国产精品久久久久久久久久10秀| 美女高潮久久久| 精品国产一区二区三区2021| 老司机免费视频一区二区| 国产免费av一区二区三区|