CGLIB代理

minororange發表於2021-09-22

說明

CGLIB代理

CGLIB 是透過操作位元組碼生成 現實類 的子類,將子類中的現實方法轉發到攔截器中,攔截器再呼叫 現實類 的方法

Code demo

現實類


public class UserQueryImpl {

    public Integer update() {
        log.info("更新使用者操作");
        return null;
    }

    public String queryUserName() {
        log.info("查詢使用者操作");
        return null;
    }

}

攔截器

public class LogInterceptor implements MethodInterceptor {

    @Override
    public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        before(o, method, args);
        Object result = methodProxy.invokeSuper(o, args);
        after(o, method, args);
        return result;
    }

    public void before(Object actualClass, Method method, Object[] args) {
        log.info("before run :class={} method={} args={}", actualClass.getClass(), method.getName(), args);
    }

    public void after(Object actualClass, Method method, Object[] args) {
        log.info("after run :class={} method={} args={}", actualClass.getClass(), method.getName(), args);
    }
}

建立代理

public class CglibProxy {

    public static <T> T make(T object) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(object.getClass());
        enhancer.setCallback(new LogInterceptor());

        return (T) enhancer.create();
    }
}

呼叫

    public void testCglib() {
        UserQueryImpl userQuery = CglibProxy.make(new UserQueryImpl());
        userQuery.queryUserName();
        userQuery.update();
    }

總結

  1. CGLIB 與 JDK 動態代理的區別
    • JDK 是透過反射實現,CGLIB 是透過生成位元組碼實現
    • JDK 動態代理需要 現實類 有介面實現,CGLIB 不需要
  2. 實際開發中的作用:
    在實際開發中,攔截器 或者 呼叫類 往往都是實現一些公用的、全域性性的邏輯,普通開發只用聚焦業務開發,就整體專案而言,動態代理極大地減少了專案的耦合性。
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章