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

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

Java兩種方式實現動態代理

瀏覽:179日期:2022-08-23 09:04:59

一、JDK動態代理

Java 在 java.lang.reflect 包中有自己的代理支持,該類(Proxy.java)用于動態生成代理類,只需傳入目標接口、目標接口的類加載器以及 InvocationHandler 便可為目標接口生成代理類及代理對象。我們稱這個Java技術為:動態代理

@CallerSensitivepublic static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException{//...}

在 Java 中規定,要想產生一個對象的代理對象,那么這個對象必須要有一個接口,因此 interfaces 必須是一個接口。

在動態代理技術里,由于不管用戶調用代理對象的什么方法,都是調用開發人員編寫的 InvocationHandler 的 invoke 方法(這相當于 invoke 方法攔截到了代理對象的方法調用)。

因此 JDK 動態代理的整體流程為:

實現 InvocationHandler,用來處理對象攔截后的邏輯。(該對象必須是接口,或者父類是接口) 使用 Proxy.newProxyInstance 產生代理對象。

以下是一個用 JDK 動態代碼實現 AOP 的具體例子:

1.目標(Target)類

public interface UserService { void eat();}

public class UserServiceImpl implements UserService { @Override public void eat() { System.out.println('吃東西'); }}

2.切面(Aspect)類

public class MyAspect { /** * 前置通知 */ public void before() { System.out.print('先洗手再'); }}

3. 織入(Weaving)過程

/** * 產生代理對象的工廠類 */public class MyFactoryBean { private MyFactoryBean() { } public static UserService getInstance() { // target : 目標類 final UserService userService = new UserServiceImpl(); // Aspect : 切面類 final MyAspect myAspect = new MyAspect(); // Weaving : 織入,也就是產生代理的過程 UserService proxyInstance = (UserService) Proxy.newProxyInstance(UserService.class.getClassLoader(),new Class[]{UserService.class}, (Object proxy, Method method, Object[] args) -> { // 模擬切點 - pointcut if ('eat'.equals(method.getName())) { myAspect.before(); } return method.invoke(userService, args);}); return proxyInstance; }}

public static void main(String[] args) { UserService userService = MyFactoryBean.getInstance(); // 先洗手再吃東西 userService.eat(); }

想想看,這其實跟我們平常使用的 AOP 已經很相似了,Spring 里面定義了前置通知(@Before)、異常通知(@AfterThrowing)等等,Spring 只是換成了甄別這些注解來選擇什么時候調用通知方法,另外,Spring 還通過切點表達式來選擇目標類和切入點。

二、CGLIB動態代理

CGLIB 動態代理需要引入第三方的庫,它通過修改代理對象生成子類的方式來實現調用攔截,代理對象不需要實現接口,但是代理類不能是 final,代理的方法也不能是 final。

/** * 產生代理對象的工廠類 */public class MyFactoryBean { private MyFactoryBean() { } public static UserService getInstance() { // target : 目標類 final UserService userService = new UserServiceImpl(); // Aspect : 切面類 final MyAspect myAspect = new MyAspect(); // Weaving : 織入,也就是產生代理的過程 Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(userService.getClass()); enhancer.setUseCache(false); enhancer.setCallback(new MethodInterceptor() { @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {// 模擬 pointcut-切點if ('eat'.equals(method.getName())) { myAspect.before();}return methodProxy.invokeSuper(o, objects); } }); return (UserService) enhancer.create(); } public static void main(String[] args) { UserService proxyInstance = MyFactoryBean.getInstance(); // 先洗手再吃東西 proxyInstance.eat(); }}

三、總結

在 JDK 中實現動態代理時,要求代理類必須是接口或繼承接口的類,因為 JDK 最后生成的 proxy class 其實就是實現了代理類所代理的接口并且繼承了 java 中的 Proxy 類(繼承 Proxy 類是為了判斷該類是否為代理類),通過反射找到接口的方法,調用 InvocationHandler的invoke 方法實現攔截。

CGLIB 字節碼增強是JDK動態代理的一個很好的補充, CGLIB 中最后生成的 proxy class 是一個繼承代理類所代理的 class,通過重寫被代理類中的非 final 的方法實現代理。

總結為:

JDK 動態代理:代理類必須是接口或繼承接口的類。 CGLIB 字節碼增強: 代理類不能是 final,代理的方法也不能是 final(繼承限制) 。

關于在 Spring 的 AOP 中采用何種代理手段,我們不強加限制的話,會根據類是否有接口來區別對待:

當一個類有接口的時候,就會選用 JDK 的動態代理。 當一個類沒有實現接口的時候,就會選用 CGLIB 代理的方式。

以上就是Java兩種方式實現動態代理的詳細內容,更多關于Java 動態代理的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
午夜在线播放视频欧美| 国产福利片在线观看| 久久中文在线| 精品女同一区二区三区在线观看| 国产精品亲子伦av一区二区三区| 精品视频在线观看网站| 日韩1区2区| 欧美日中文字幕| 中文字幕乱码亚洲无线精品一区| 日韩高清二区| 国产一区2区| 久久中文字幕av一区二区不卡| 六月天综合网| 国产精品啊啊啊| 欧美 日韩 国产精品免费观看| 久久亚洲欧美| 国产亚洲欧美日韩在线观看一区二区| 你懂的亚洲视频| 日韩久久视频| 日本不卡高清| 亚洲成人va| 日本特黄久久久高潮| 成人国产精选| 亚洲无线观看| 日韩一区欧美| 久久国际精品| 99成人在线| 精品一级视频| 综合亚洲视频| 免费av一区二区三区四区| 日本欧美韩国一区三区| 久久三级中文| 日韩欧美在线精品| 午夜久久免费观看| 精品一区av| 亚洲一二av| 日韩高清不卡| 中文一区一区三区高中清不卡免费| 日韩影院精彩在线| 久久婷婷激情| 精品视频高潮| 欧美黄色一区二区| 日韩av在线免费观看不卡| 国产精品毛片在线| 欧美午夜精品一区二区三区电影| 你懂的网址国产 欧美| 性一交一乱一区二区洋洋av| 日韩成人三级| 高清av一区| 国语对白精品一区二区| 久久亚洲人体| 高清久久精品| 精品国产乱码久久久| 久久精品亚洲一区二区| 国产精品1区在线| 国产调教精品| 日韩黄色av| 国产精品美女在线观看直播| 久久精品av麻豆的观看方式| 日本中文字幕一区二区| 中文字幕亚洲精品乱码| 久久最新视频| 亚洲色图综合| 日本午夜精品一区二区三区电影| 亚洲精品高潮| 国产精品自拍区| 美女精品久久| 福利精品一区| 91国语精品自产拍| 午夜亚洲福利在线老司机| 日韩午夜一区| 日韩av字幕| 成人在线视频区| 久久美女精品| 亚洲日韩中文字幕一区| 国产精品免费不| 美女视频黄免费的久久| 日韩激情一区| 亚洲天堂av资源在线观看| 国产欧美69| 久久久影院免费| 欧美日韩精品一区二区三区视频 | 视频一区在线播放| 亚洲欧美久久久| 欧美日本不卡| 电影亚洲精品噜噜在线观看| 日本久久成人网| 亚洲欧美日韩国产一区| 国产欧美在线| 国产一区日韩欧美| 国产福利一区二区三区在线播放| 久久久久久久久久久妇女| 亚洲精品美女| 日韩成人综合| 久久国产免费看| 国产综合激情| 精品视频亚洲| 香蕉精品999视频一区二区| 国产精品玖玖玖在线资源| 国产日韩在线观看视频| 国产三级一区| 成人在线超碰| 成人羞羞在线观看网站| 亲子伦视频一区二区三区| 亚洲大片在线| 视频一区二区国产| 亚洲美女91| 国产精品欧美日韩一区| 欧美午夜精彩| 欧美亚洲精品在线| 国产aa精品| 国产精品一区二区精品| 另类国产ts人妖高潮视频| 精品色999| 国产日本精品| 一区二区精品| 激情欧美丁香| 国产99精品| 国产欧洲在线| 精品国产乱码久久久久久1区2匹| 麻豆久久久久久久| 国产日韩三级| 久久久久.com| 丝袜亚洲另类欧美| 国产欧美一区二区三区米奇| 性一交一乱一区二区洋洋av| 欧美日韩在线观看视频小说| 激情视频网站在线播放色| 国产乱子精品一区二区在线观看| 亚洲综合丁香| 亚洲综合图色| 中文字幕日韩高清在线| 久久亚洲二区| 亚洲理论在线| 综合激情一区| 国产欧美日韩影院| 国产精品第一| 麻豆精品久久| 成人午夜在线| 成人久久一区| 欧美成人午夜| 亚洲欧美日韩在线观看a三区| 亚洲国内欧美| 亚洲激情社区| 最新国产精品久久久| 日韩精品91亚洲二区在线观看| 亚洲精品人人| 欧美成人精品一级| 狠狠久久伊人| 久久久久久久久99精品大| 亚洲国产一区二区在线观看| 日本大胆欧美人术艺术动态| 日本在线视频一区二区| 国产欧美另类| 成年男女免费视频网站不卡| 久久国产小视频| 亚洲中午字幕| 欧美激情网址| 欧美精品自拍| 亚洲人成精品久久久| 久久精品99国产精品| 亚洲黄色中文字幕| 免费在线观看一区二区三区| 国产欧美日韩在线一区二区| 成人精品视频| 国精品一区二区三区| 亚洲免费资源| 日韩大片在线观看| 亚洲人妖在线| av资源中文在线天堂| 日韩视频在线一区二区三区| 国产亚洲欧美日韩在线观看一区二区 | 国产精品3区| 久久精品国语| 国产探花一区二区| 99久精品视频在线观看视频| 免费看黄色91| 精品国产精品久久一区免费式| 激情综合网站| 久久精品二区亚洲w码| 免费一级片91| 夜鲁夜鲁夜鲁视频在线播放| 免费不卡在线观看| 快播电影网址老女人久久| 97久久超碰| 成人av二区| 国产精品国产三级国产在线观看| 一区在线免费| 日韩在线二区| 国产精品扒开腿做爽爽爽软件| 亚洲黑丝一区二区| 精品久久久中文字幕| 日本99精品| 欧美一区=区| 日韩国产专区| 国产成人精选| 麻豆久久久久久| 国产丝袜一区| 日韩精品三级| 亚洲一区二区日韩|