米利唐_后腰_乌克兰足球超级联赛_中国竞彩欧赔 - 足球竞彩分析

集團官網
  • 國家級全民數字素養與技能培訓基地
  • 河南省第一批產教融合型企業建設培育單位
  • 鄭州市數字技能人才(碼農)培養評價聯盟

Spring對JDK和CgLib動態代理該怎么選?

編輯:云和數據 日期:2023-03-21 17:48

Spring框架在實現動態代理時,提供了兩種選擇:基于JDK的動態代理和基于CgLib的動態代理。

JDK動態代理只能代理實現了接口的類,而CgLib動態代理可以代理沒有實現接口的類。因此,如果需要代理的類實現了接口,建議使用JDK動態代理;如果需要代理的類沒有實現接口,或者需要對類的方法進行代理而不是接口的方法,建議使用CgLib動態代理。

另外,由于JDK動態代理是基于接口的,因此它的代理效率比CgLib動態代理要高。在大多數情況下,建議首選JDK動態代理,只有在必要的情況下才考慮使用CgLib動態代理。

需要注意的是,如果需要代理的類已經是final類,則無法使用CgLib動態代理代理該類。此外,CgLib動態代理也可能會影響應用程序的性能,因此在使用CgLib動態代理時,需要謹慎評估其對性能的影響。

下面是使用Spring基于JDK和CgLib動態代理的示例代碼。

假設我們有一個接口UserService和一個實現類UserServiceImpl,代碼如下:

public?interface?UserService?{????void?addUser();}public?class?UserServiceImpl?implements?UserService?{????@Override????public?void?addUser()?{????????System.out.println("Add?user.");????}}

現在我們想要在調用UserServiceImpl的addUser()方法之前和之后執行一些額外的邏輯。我們可以使用Spring的動態代理功能來實現這一點。

基于JDK的動態代理示例代碼如下:

import?java.lang.reflect.InvocationHandler;import?java.lang.reflect.Method;import?java.lang.reflect.Proxy;public?class?UserServiceProxy?implements?InvocationHandler?{????private?UserService?userService;????public?UserServiceProxy(UserService?userService)?{????????this.userService?=?userService;????}????@Override????public?Object?invoke(Object?proxy,?Method?method,?Object[]?args)?throws?Throwable?{????????System.out.println("Before?addUser.");????????Object?result?=?method.invoke(userService,?args);????????System.out.println("After?addUser.");????????return?result;????}????public?static?void?main(String[]?args)?{????????UserService?userService?=?new?UserServiceImpl();????????InvocationHandler?handler?=?new?UserServiceProxy(userService);????????UserService?userServiceProxy?=?(UserService)?Proxy.newProxyInstance(????????????????userService.getClass().getClassLoader(),????????????????userService.getClass().getInterfaces(),????????????????handler????????);????????userServiceProxy.addUser();????}}

基于CgLib的動態代理示例代碼如下:

import?net.sf.cglib.proxy.MethodInterceptor;import?net.sf.cglib.proxy.MethodProxy;import?net.sf.cglib.proxy.Enhancer;public?class?UserServiceCgLibProxy?implements?MethodInterceptor?{????private?UserService?userService;????public?UserServiceCgLibProxy(UserService?userService)?{????????this.userService?=?userService;????}????@Override????public?Object?intercept(Object?obj,?Method?method,?Object[]?args,?MethodProxy?proxy)?throws?Throwable?{????????System.out.println("Before?addUser.");????????Object?result?=?proxy.invoke(userService,?args);????????System.out.println("After?addUser.");????????return?result;????}????public?static?void?main(String[]?args)?{????????UserService?userService?=?new?UserServiceImpl();????????Enhancer?enhancer?=?new?Enhancer();????????enhancer.setSuperclass(userService.getClass());????????enhancer.setCallback(new?UserServiceCgLibProxy(userService));????????UserService?userServiceProxy?=?(UserService)?enhancer.create();????????userServiceProxy.addUser();????}}

以上兩個示例代碼中,我們都定義了一個代理類,并實現了InvocationHandler或MethodInterceptor接口來處理方法調用。在main方法中,我們通過Proxy.newProxyInstance()或Enhancer.create()方法來創建代理對象,并調用其方法,此時代理對象會自動調用我們定義的invoke()或intercept()方法來執行相應的邏輯。

相關內容

搶先一步 鴻蒙(HarmonyOS)應用開發者高級認證 免費考! 適合人群計算機相關專業在校生(技師、中職、高職、本科、研究生)對鴻蒙(HarmonyOS)有興趣的非計算機相關專業在校生目前正在從事移動應用的開發者目前正在從事計算機行業相關的人計算機專業高校老師所有對鴻蒙(HarmonyOS)有興趣的人 培訓方案掌握鴻蒙的核心概念和端云一體化開發、... 什么是Java的多態性(polymorphism)?它有哪些不同的形式? 多態性是Java面向對象編程的一個重要概念,它允許不同的對象以一致的方式響應同一個方法調用,具體表現為對象在運行時可以表現出多個不同的形態。多態性主要有兩種不同的形式:編譯時多態性(靜態多態性)和運行時多態性(動態多態性)。1. 編譯時多態性(靜態多態性):   ... 如何學習和搭建Hadoop開發環境? Hadoop是大數據處理領域的重要平臺,能夠處理和分析大量數據。為了有效地利用Hadoop,我們需要學習其基礎知識,并正確搭建開發環境。下面是詳細的學習和搭建指南。一、學習Hadoop基礎掌握基礎概念和原理Hadoop主要由HDFS和MapReduce兩部分組成。HDFS是分布式文件系統,Ma... UI 設計學習如何進階成為高手 我總結了六種方法,幫助你走出舒適區,提高技能,成長為自信且經驗豐富的UI設計高手一位經驗豐富的 UI 設計師,往往十分看中應用程序界面的吸引力和視覺刺激,確保滿足用戶期望和需求。但是,如果你已經在 UI 設計圈摸爬滾打多年,仍然沒有出色的作品,那你極有可能是因為陷入了一個舒適圈,UI技能一直原... 在Java中Executor和Executors的區別? 在Java中,Executor和Executors都與線程池和并發執行有關,但它們是不同的概念和類。1.ExecutorExecutor是一個接口,位于java.util.concurrent包中,用于表示一個執行任務的執行器。它只定義了一個方法:void execute(Runnable c... String類型的常見命令有哪些? String類型,也就是字符串類型,是Redis中最簡單的存儲類型。其value是字符串,不過根據字符串的格式不同,又可以分為3類:string是普通字符串,int整數類型,可以做自增、自減操作,float浮點類型,可以做自增、自減操作。String的常見命令有:SET:添加或者修改已經存在的...