spring中的CGLIB动态代理(代码)
生活随笔
收集整理的這篇文章主要介紹了
spring中的CGLIB动态代理(代码)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
因?yàn)閖dk帶來(lái)具有局限性,使用動(dòng)態(tài)代理的對(duì)象必須實(shí)現(xiàn)一個(gè)或多個(gè)接口,CGLIB代理不需要實(shí)現(xiàn)接口
UserDao.java目標(biāo)類(lèi):
package com.liu.cglib;//目標(biāo)類(lèi) public class UserDao {public void addUser() {System.out.println("添加方法");}public void deleteUser() {System.out.println("刪除方法");}}CglibProxy.java代理類(lèi):
package com.liu.cglib;import java.lang.reflect.Method;import org.springframework.cglib.proxy.Enhancer; import org.springframework.cglib.proxy.MethodInterceptor; import org.springframework.cglib.proxy.MethodProxy; //代理類(lèi)import com.liu.aspect.MyAspect;public class CglibProxy implements MethodInterceptor{//創(chuàng)建代理方法public Object createProxy(Object object) {//創(chuàng)建一個(gè)動(dòng)態(tài)類(lèi)對(duì)象Enhancer enhancer = new Enhancer();//確定需要增強(qiáng)的類(lèi) 設(shè)置其父類(lèi)enhancer.setSuperclass(object.getClass());//添加回調(diào)函數(shù)enhancer.setCallback(this);//返回創(chuàng)建的代理類(lèi)return enhancer.create();}//proxy cglib根據(jù)定義的父類(lèi)生成的代理對(duì)象//method 攔截的方法//args 攔截的方法的參數(shù)數(shù)組//methProxy 方法的代理對(duì)象 用于執(zhí)行父類(lèi)的方法@Overridepublic Object intercept(Object proxy, Method method, Object[] args, MethodProxy methProxy) throws Throwable {// TODO Auto-generated method stub//創(chuàng)建切面對(duì)象MyAspect myAspect = new MyAspect();//前置增強(qiáng)myAspect.chek();//目標(biāo)方法執(zhí)行Object obj = methProxy.invokeSuper(proxy, args);//后置增強(qiáng)myAspect.log();return obj;}}MyAspect.java切面類(lèi):
package com.liu.aspect;//切面類(lèi):里面可以存在多個(gè)advice通知方法 也就是增強(qiáng)類(lèi) public class MyAspect {public void chek() {System.out.println("模擬檢查方法....");}public void log() {System.out.println("模擬記錄日志....");} }CglibTest.java測(cè)試類(lèi):
package com.liu.cglib;public class CglibTest {public static void main(String[] args) {//創(chuàng)建代理對(duì)象CglibProxy cglibProxy = new CglibProxy(); //創(chuàng)建目標(biāo)對(duì)象UserDao userDao = new UserDao();//將目標(biāo)對(duì)象傳入代理對(duì)象中 獲取增強(qiáng)后的方法UserDao userDao2 = (UserDao) cglibProxy.createProxy(userDao);//執(zhí)行userDao2.addUser();userDao2.deleteUser();}}運(yùn)行結(jié)果:
模擬檢查方法.... 添加方法 模擬記錄日志.... 模擬檢查方法.... 刪除方法 模擬記錄日志....JDK動(dòng)態(tài)代理:https://blog.csdn.net/weixin_45151960/article/details/104602936
總結(jié)
以上是生活随笔為你收集整理的spring中的CGLIB动态代理(代码)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: spring中的jdk动态代理(代码步骤
- 下一篇: ProxyFactoryBean(代码)