SpringCGLlB中怎么實現(xiàn)動態(tài)代理,相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
為延壽等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及延壽網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都做網(wǎng)站、成都網(wǎng)站制作、延壽網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!
1. 創(chuàng)建目標類 GoodsDao
在 com.mengma.dao 包下創(chuàng)建目標類 GoodsDao,在類中定義增、刪、改、查方法,并在每個方法編寫輸出語句,如下所示。
package com.mengma.dao;public class GoodsDao { public void add() { System.out.println("添加商品..."); } public void update() { System.out.println("修改商品..."); } public void delete() { System.out.println("刪除商品..."); } public void find() { System.out.println("修改商品..."); }}
2. 創(chuàng)建代理類 MyBeanFactory
在 src 目錄下創(chuàng)建一個名為 com.mengma.cglib 的包,該包下創(chuàng)建類 MyBeanFactory,如下所示。
package com.mengma.cglib;import java.lang.reflect.Method;import org.springframework.cglib.proxy.Enhancer;import org.springframework.cglib.proxy.MethodInterceptor;import org.springframework.cglib.proxy.MethodProxy;import com.mengma.dao.GoodsDao;import com.mengma.jdk.MyAspect;public class MyBeanFactory { public static GoodsDao getBean() { // 準備目標類 final GoodsDao goodsDao = new GoodsDao(); // 創(chuàng)建切面類實例 final MyAspect myAspect = new MyAspect(); // 生成代理類,CGLIB在運行時,生成指定對象的子類,增強 Enhancer enhancer = new Enhancer(); // 確定需要增強的類 enhancer.setSuperclass(goodsDao.getClass()); // 添加回調(diào)函數(shù) enhancer.setCallback(new MethodInterceptor() { // intercept 相當(dāng)于 jdk invoke,前三個參數(shù)與 jdk invoke—致 @Override public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { myAspect.myBefore(); // 前增強 Object obj = method.invoke(goodsDao, args); // 目標方法執(zhí)行 myAspect.myAfter(); // 后增強 return obj; } }); // 創(chuàng)建代理類 GoodsDao goodsDaoProxy = (GoodsDao) enhancer.create(); return goodsDaoProxy; }}
上述代碼中,應(yīng)用了 CGLIB 的核心類 Enhancer。在第 19 行代碼調(diào)用了 Enhancer 類的 setSuperclass() 方法,確定目標對象。
第 21 行代碼調(diào)用 setCallback() 方法添加回調(diào)函數(shù);第 24 行代碼的 intercept() 方法相當(dāng)于 JDK 動態(tài)代理方式中的 invoke() 方法,該方法會在目標方法執(zhí)行的前后,對切面類中的方法進行增強;第 33~34 行代碼調(diào)用 Enhancer 類的 create() 方法創(chuàng)建代理類,最后將代理類返回。
3. 創(chuàng)建測試類
在 com.mengma.cglib 包下創(chuàng)建測試類 CGLIBProxyTest,編輯后如下所示。
package com.mengma.cglib;import org.junit.Test;import com.mengma.dao.GoodsDao;public class CGLIBProxyTest { @Test public void test() { // 從工廠獲得指定的內(nèi)容(相當(dāng)于spring獲得,但此內(nèi)容時代理對象) GoodsDao goodsDao = MyBeanFactory.getBean(); // 執(zhí)行方法 goodsDao.add(); goodsDao.update(); goodsDao.delete(); goodsDao.find(); }}
看完上述內(nèi)容,你們掌握SpringCGLlB中怎么實現(xiàn)動態(tài)代理的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!