使用CGLIB實現動態代理


參考:https://blog.csdn.net/yhl_jxy/article/details/80633194#comments

CGLIB動態代理

定義:CGLIB(code genaration libary), 代碼自動生成類庫。

在程序運行中自動生成擴展類和實現java接口,是一個強大的高性能的代碼生成包

CGLIB動態代理的實現

1)、導入cglib所需的jar包

2)、實現MethodIntercetor類,實現代理類對象的具體邏輯

       重寫intercept()方法,在intercept方法中實現代理的邏輯

      intercept(Object o, Method method, Object[] Objects, MehodProxy methodProxy )

       o: 被代理類對象

        method: 被代理類的方法

    objects: 被代理類方法的參數

     methodProxy: 調用被代理類對象的參數

3)、使用Enhance生成代理類對象

          enhance.create() //生成代理類對象

使用CGLIB實現延遲加載

MehodInterceptor實現類:

/**
 * 實現代理的邏輯
 * 步驟:
 *   --: 1、實現MethodInterceptor攔截器
 *        o: 被代理對象
 *        method: 被代理對象的方法
 *        objects: 被代理對象的方法參數
 *        methodProxy: 觸發父類方法的對象
 */
public class DBQueryCglibMethodInterceptor implements MethodInterceptor {
    DBQuery dbQuery = null;
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
           if(dbQuery == null){
               dbQuery = new DBQuery();
           }
           return dbQuery.Request();
    }
}

真實類:

/**
 * 使用cglib來實現數據庫的查詢
 */
public class DBQuery {
    public String Request(){
        return "數據庫查詢完畢";
    }
}

使用類:

public class Client {
    public static void main(String[] args) {
        /**
         * 創建增強類對象
         */
        Enhancer enhancer = new Enhancer();

        /**
         * 創建增強類的父類對象
         */
        enhancer.setSuperclass(DBQuery.class);

        /**
         * 創建攔截切入類
         */
        enhancer.setCallback(new DBQueryCglibMethodInterceptor());

        /**
         * 創建代理對象
         */
        DBQuery dbQueryProxy = (DBQuery) enhancer.create();
        String result = dbQueryProxy.Request();
        System.out.println(result);
    }
}

結果:

數據庫查詢完畢

使用CGLIB增強原有類的功能

MethodIntercptor實現類

/**
 * cglib代理邏輯切入類
 *  ---: intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy)
 *       o: 被代理類對象
 *       method: 要攔截的被代理類的方法
 *       objects:被代理類的方法參數
 *       methodyProxy: 要觸發父類的方法對象
 */
public class CglibMethodInteceptor implements MethodInterceptor {
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("插入前置通知");
        Object object = methodProxy.invokeSuper(o, objects);
        System.out.println("插入后置通知");
        return object;
    }
}

真實類:

/**
 * 使用cglib實現動態代理,不用創建接口
 */
public class HelloService {
    HelloService(){
        System.out.println("HelloServie構造器");
    }

    public final String sayOthers(String name){
        System.out.println("HelloService: sayOthers" +name);
        return null;
    }

    public void sayHello(){
        System.out.println("HelloService: sayHello");
    }

    public void sayByeBye(){
        System.out.println("HelloService: sayByeBye");
    }
}

使用類:

public class Client {
    public static void main(String[] args) {
        System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "D:\\code");
        /**
         * 創建增強類對象
         */
        Enhancer enhancer = new Enhancer();

        /**
         * 創建需要增強的父類對象
         */
        enhancer.setSuperclass(HelloService.class);

        /**
         * 設置切入類對象
         */
        enhancer.setCallback(new CglibMethodInteceptor());

        /**
         * 生成代理對象
         */

        HelloService service = (HelloService) enhancer.create();
        service.sayHello();
        service.sayByeBye();
    }
}

結果:

HelloServie構造器
插入前置通知
HelloService: sayHello
插入后置通知
插入前置通知
HelloService: sayByeBye
插入后置通知


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM