【代码生成】cglib

【代码生成】cglib

使用 cglib :

// ...
public class DaoProxy implements MethodInterceptor {

    @Override
    public Object intercept(Object object, Method method, Object[] objects, MethodProxy proxy) throws Throwable {
        String methodName = method.getName();

        if ("insert".equals(methodName) || "update".equals(methodName)) {
            System.out.println(methodName + "()方法开始时间:" + System.currentTimeMillis());
            proxy.invokeSuper(object, objects);
            System.out.println(methodName + "()方法结束时间:" + System.currentTimeMillis());
            return object;
        }
        proxy.invokeSuper(object, objects);
        return object;
    }
}
//...

调用代码:

// ...
public static void main(String[] args) {
    DaoProxy daoProxy = new DaoProxy();

    Enhancer enhancer = new Enhancer();
    enhancer.setSuperclass(DaoImpl.class);
    enhancer.setCallback(daoProxy);

    Dao dao = (DaoImpl)enhancer.create();
    dao.insert();
    System.out.println("----------分割线----------");
    dao.delete();
    System.out.println("----------分割线----------");
    dao.update();
}
// ...
使用CGLIB并不一定比使用Java代理更好,这两种各有优缺点,像Spring框架就同时支持Java Proxy与CGLIB两种方式.

缺点:
无论使用Java代理还是使用CGLIB,编写这部分代码都稍显麻烦
代码之间的耦合还是没有解决,像要针对delete()方法加上这部分逻辑就必须修改代码

代理类的作用: 代理某个具体类,在该类的方法调用之前,拦截调用,并执行 代理类的intercept() 拦截方法拦截调用,执行一些 创建数据库连接、日志记录的操作,并在该方法中 调用 proxy.invokeSuper(obj, args) 执行之前被拦截的方法。

0 0 vote
Article Rating
Subscribe
提醒
guest
0 评论
Inline Feedbacks
View all comments