91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JDK和CGLib動態代理怎么實現

發布時間:2021-12-22 15:50:31 來源:億速云 閱讀:130 作者:iii 欄目:編程語言

本篇內容介紹了“JDK和CGLib動態代理怎么實現”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

前言:動態代理是一種常用的設計模式,廣泛應用于框架中,Spring框架的AOP特性就是應用動態代理實現的,想要理解AOP的實現原理我們就必須先理解動態代理。

什么是代理模式

代理模式是GOF23設計模式之一,代理模式中存在代理者和被代理者,代理者和被代理者都具有相同的功能,并且代理者執行功能時會附加一些額外的操作

如:手機工廠和代理商都具有賣東西的功能,手機代理商除了幫工廠賣手機外,還能在賣手機前打廣告推銷,賣手機后還可以進行售后服務。

JDK和CGLib動態代理怎么實現

代理模式的優點:

1)符合開閉原則,不用修改被代理者任何的代碼,就能擴展新的功能

2)項目的擴展和維護比較方便

代理模式分為:靜態代理和動態代理

靜態代理

什么是靜態代理

1)代理者和被代理者都實現了相同的接口(或繼承相同的父類)

2)代理者包含了一個被代理者的對象

3)調用功能時,代理者會調用被代理者的功能,同時附加新的操作

  1. /**

  2. * 賣手機

  3. */

  4. public interface SellMobilePhone {

  5. void sellMobilePhone();

  6. }

  7. /**

  8. * 小米手機工廠

  9. */

  10. public class MiPhoneFactory implements SellMobilePhone{

  11. public void sellMobilePhone() {

  12. System.out.println("生產了小米9手機,賣出去!!");

  13. }

  14. }

  15. /**

  16. * 小米代理商

  17. */

  18. public class MiPhoneAgent implements SellMobilePhone {

  19. //被代理者,工廠對象

  20. private SellMobilePhone factory;

  21. //通過構造方法傳入被代理者

  22. public MiPhoneAgent(SellMobilePhone factory){

  23. this.factory = factory;

  24. }

  25. public void sellMobilePhone() {

  26. System.out.println("打廣告,做活動~~~~~~~~~~~~~~~~~");

  27. //調用被代理者的方法

  28. factory.sellMobilePhone();

  29. System.out.println("做售后,做推銷~~~~~~~~~~~~~~~~~");

  30. }

  31. }

  32. public class TestStaticProxy {

  33. @Test

  34. public void testProxy(){

  35. //創建被代理者

  36. SellMobilePhone factory = new MiPhoneFactory();

  37. factory.sellMobilePhone();

  38. System.out.println("---------------------------------------");

  39. //創建代理者

  40. SellMobilePhone agent = new MiPhoneAgent(factory);

  41. //調用賣手機

  42. agent.sellMobilePhone();

  43. }

  44. }

靜態代理的問題:

靜態代理只能適合一種業務,如果有新的業務,就必須創建新的接口和新的代理,如添加賣電腦的接口和電腦工廠,就要創建新的電腦代理類。

動態代理

動態代理的特點:

1) 在不修改原有類的基礎上,為原來類添加新的功能

2) 不需要依賴某個具體業務

動態代理分為:JDK動態代理和CGLib動態代理

區別是:

JDK動態代理的被代理者必須實現任意接口

CGLib動態代理不用實現接口,是通過繼承實現的

JDK動態代理

實現步驟:

1)代理類需要實現InvocationHandler接口

2)實現invoke方法

3)通過Proxy類的newProxyInstance方法來創建代理對象

  1. /**

  2. * 動態代理

  3. */

  4. public class SalesAgent implements InvocationHandler{

  5. //被代理者對象

  6. private Object object;

  7. /**

  8. * 創建代理對象

  9. * @param object 被代理者

  10. * @return 代理者

  11. */

  12. public Object createProxy(Object object){

  13. this.object = object;

  14. //Proxy.newProxyInstance創建動態代理的對象,傳入被代理對象的類加載器,接口,InvocationHandler對象

  15. return Proxy.newProxyInstance(object.getClass().getClassLoader(),object.getClass().getInterfaces(),this);

  16. }

  17. /**

  18. * 調用被代理者方法,同時添加新功能

  19. */

  20. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

  21. System.out.println("銷售之前,打廣告~~~~~~");

  22. //調用被代理者的方法

  23. Object result = method.invoke(object,args);

  24. System.out.println("銷售之后,做售后~~~~~~");

  25. return result;

  26. }

  27. }

  28. public class TestInvocationHandler {

  29. @Test

  30. public void testInvocation(){

  31. //創建動態代理對象

  32. SalesAgent agent = new SalesAgent();

  33. //被代理對象

  34. SellMobilePhone sellMobilePhone = new MiPhoneFactory();

  35. //創建代理對象

  36. SellMobilePhone phoneProxy = (SellMobilePhone) agent.createProxy(sellMobilePhone);

  37. phoneProxy.sellMobilePhone();

  38. }

  39. }

CGLib動態代理

特點:通過繼承實現,被代理者必須能被繼承,通過被代理類創建子類,子類就是父類的代理。

  1. /**

  2. * CGLib動態代理

  3. *

  4. */

  5. public class CGLibProxy implements MethodInterceptor {

  6. /**

  7. * 返回代理對象

  8. * @param object 被代理對象

  9. * @return 代理對象

  10. */

  11. public Object createProxy(Object object){

  12. //創建加強器

  13. Enhancer eh = new Enhancer();

  14. //設置被代理對象的類為父類

  15. eh.setSuperclass(object.getClass());

  16. //設置代理對象的回調

  17. eh.setCallback(this);

  18. return eh.create();

  19. }

  20. public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {

  21. System.out.println("售前~~~~~~CGLIB");

  22. //調用父類對象的方法

  23. Object res = proxy.invokeSuper(obj, args);

  24. System.out.println("售后~~~~~~CGLIB");

  25. return res;

  26. }

  27. }

“JDK和CGLib動態代理怎么實現”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

改则县| 鹤庆县| 通化县| 台东市| 梨树县| 文山县| 永登县| 宁武县| 江口县| 横峰县| 日喀则市| 柳州市| 大同县| 万山特区| 开原市| 松滋市| 海兴县| 双柏县| 留坝县| 湘潭市| 宾川县| 镇原县| 专栏| 杭锦后旗| 霍州市| 台南县| 宜川县| 六枝特区| 广汉市| 新安县| 舞阳县| 巴彦县| 云霄县| 出国| 祥云县| 海门市| 浪卡子县| 马关县| 彭泽县| 平武县| 和平区|