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