jdk代理和cglib代理

jdk代理,核心方法为Proxy.newProxyInstance()

public class JdkProxyFactory {

    public static <T> T getProxyObject(T targetClass){

        return (T) Proxy.newProxyInstance(
                targetClass.getClass().getClassLoader(),    //第一个参数是类加载器
                targetClass.getClass().getInterfaces(),     //第二个参数是目标类的接口
                (proxy, method, args) -> {                  //第三个参数是代理实例的调用处理程序实现的接口!其实就是具体实现的方式
            MyAspect myAspect = new MyAspect();
            myAspect.before();
            //这里是调用目标的方法
            Object invoke = method.invoke(targetClass, args);
            myAspect.after();
            return invoke;
        });
    }

cglib代理,核心方法Enhancer.create()

public class CglibProxyFactory {
    public static <T> T getCglibProxy(T targetClass){
        Object o = Enhancer.create(
                targetClass.getClass(), //第一个参数是获取目标类的class对象
                (InvocationHandler) (o1, method, objects) -> {  //具体的目标类的调用处理程序的具体实现
            MyAspect myAspect = new MyAspect();
            myAspect.before();  //前置增强
            Object invoke = method.invoke(targetClass, objects);
            myAspect.after();   //后置增强
            return invoke;
        });
        return (T) o;
    }
}

如何选择,就看目标代理对象是否有对应的接口,如果有对应的接口就选择jdk代理,如果目标类只有实现类,没有对应接口,就使用cgLib代理。

图里面的MyAspect类只是写的一个增强的方法。

public class MyAspect {

    public void before(){
        System.out.println("方法之前的通知!");
    }

    public void after(){
        System.out.println("方法之后的通知!");
    }
}

 

posted @ 2022-03-22 14:42  程序员hg  阅读(91)  评论(0编辑  收藏  举报