日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring JDK动态代理

發布時間:2025/3/12 javascript 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring JDK动态代理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

JDK 動態代理是通過 JDK 中的 java.lang.reflect.Proxy 類實現的。下面通過具體的案例演示 JDK 動態代理的使用。

1. 創建項目
在 MyEclipse 中創建一個名稱為 spring 的 Web 項目,將 Spring 支持和依賴的 JAR 包復制到 Web 項目的 WEB-INF/lib 目錄中,并發布到類路徑下。

2. 創建接口 CustomerDao
在項目的 src 目錄下創建一個名為 com.mengma.dao 的包,在該包下創建一個 CustomerDao 接口,編輯后如下所示。

package com.mengma.dao;public interface CustomerDao {public void add(); // 添加public void update(); // 修改public void delete(); // 刪除public void find(); // 查詢 }

3. 創建實現類 CustomerDaoImpl
在 com.mengma.dao 包下創建 CustomerDao 接口的實現類 CustomerDaoImpl,并實現該接口中的所有方法,如下所示。
package com.mengma.dao;

public class CustomerDaoImpl implements CustomerDao {@Overridepublic void add() {System.out.println("添加客戶...");}@Overridepublic void update() {System.out.println("修改客戶...");}@Overridepublic void delete() {System.out.println("刪除客戶...");}@Overridepublic void find() {System.out.println("修改客戶...");} }

4. 創建切面類 MyAspect
在 src 目錄下,創建一個名為 com.mengma.jdk 的包,在該包下創建一個切面類 MyAspect,編輯后如下所示。

package com.mengma.jdk;public class MyAspect {public void myBefore() {System.out.println("方法執行之前");}public void myAfter() {System.out.println("方法執行之后");} }

上述代碼中,在切面中定義了兩個增強的方法,分別為 myBefore() 方法和 myAfter() 方法,用于對目標類(CustomerDaoImpl)進行增強。

5. 創建代理類 MyBeanFactory
在 com.mengma.jdk 包下創建一個名為 MyBeanFactory 的類,在該類中使用 java.lang.reflect.Proxy 實現 JDK 動態代理,如下所示。

package com.mengma.jdk;import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy;import com.mengma.dao.CustomerDao; import com.mengma.dao.CustomerDaoImpl;public class MyBeanFactory {public static CustomerDao getBean() {// 準備目標類final CustomerDao customerDao = new CustomerDaoImpl();// 創建切面類實例final MyAspect myAspect = new MyAspect();// 使用代理類,進行增強return (CustomerDao) Proxy.newProxyInstance(MyBeanFactory.class.getClassLoader(),new Class[] { CustomerDao.class }, new InvocationHandler() {public Object invoke(Object proxy, Method method,Object[] args) throws Throwable {myAspect.myBefore(); // 前增強Object obj = method.invoke(customerDao, args);myAspect.myAfter(); // 后增強return obj;}});} }

上述代碼中,定義了一個靜態的 getBean() 方法,這里模擬 Spring 框架的 IoC 思想,通過調用 getBean() 方法創建實例,第 14 行代碼創建了 customerDao 實例。

在目標類方法執行的前后,分別執行切面類中的 myBefore() 方法和 myAfter() 方法。

6. 創建測試類 JDKProxyTest
在 com.mengma.jdk 包下創建一個名為 JDKProxyTest 的測試類,如下所示。

package com.mengma.jdk;import org.junit.Test; import com.mengma.dao.CustomerDao;public class JDKProxyTest {@Testpublic void test() {// 從工廠獲得指定的內容(相當于spring獲得,但此內容時代理對象)CustomerDao customerDao = MyBeanFactory.getBean();// 執行方法customerDao.add();customerDao.update();customerDao.delete();customerDao.find();} }

上述代碼中,在調用 getBean() 方法時,獲取的是 CustomerDao 類的代理對象,然后調用了該對象中的方法。

7. 運行項目并查看結果
使用 JUnit 測試運行 test() 方法,運行成功后,控制臺的輸出結果如下圖所示。

從輸出結果中可以看出,在調用目標類的方法前后,成功調用了增強的代碼,由此說明,JDK 動態代理已經實現。

總結

以上是生活随笔為你收集整理的Spring JDK动态代理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。