Spring之代理模式实例

一、静态代理java

二、JDK动态代理spring

JDK动态代理经过反射来接收被代理的类,而且要求被代理的类必须实现一个接口,其核心是InvocationHandler接口和Proxy类。 ide

jdk动态代理之因此只能代理接口是由于代理类自己已经extends了Proxy,而java是不容许多重继承的,可是容许实现多个接口,所以才有cglib的须要吧。this

public interface Math {
    public int div(int a, int b) throws Exception;
}

@Component
public class MathCaculator implements Math {
    public MathCaculator() {
        System.out.println("MathCaculator构造器***************");
    }
    public int div(int a, int b) throws Exception {
        System.out.println("除法的方法主体");
        return a/b;
    }
}

public class DynamicProxy implements InvocationHandler {
    Object targetObject;

    public Object getProxyObejct(Object targetObject) {
        this.targetObject = targetObject;
        return Proxy.newProxyInstance(targetObject.getClass().getClassLoader()
                ,targetObject.getClass().getInterfaces(),this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        long startTime = System.currentTimeMillis();
        Thread.sleep(100);
        Object result=method.invoke(targetObject, args);
        long endTime = System.currentTimeMillis();
        System.out.println("耗时"+(endTime-startTime)+"秒");
        System.out.println("结果+"+result);
        return result;
    }
}


public class Test {
    public static void main(String[] args) throws Exception {
        Math math = (Math) new DynamicProxy().getProxyObejct(new MathCaculator());
        math.div(10,5);
    }
}

三、CGLIB动态代理 代理

 对指定的目标类生成一个子类,并覆盖其中方法实现加强,但由于采用的是继承,因此不能对final修饰的类进行代理。code

若是目标类没有实现接口,那就要选择使用CGLIB来动态代理目标类。CGLIB是经过继承的方式作的动态代理,所以,若是某个类被标记为final,那么它是没法使用CGLIB作动态代理。CGLIB会使生成的代理类继承当前的对象,并在代理类中对代理方法进行强化处理(前置处理、后置处理等)。对象

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class CglibDynamicProxy implements MethodInterceptor {
    Object targetObject;

    public Object getProxyObject(Object object){
        System.out.println("cglib建立代理");
        this.targetObject = object;
        Enhancer enhancer = new Enhancer();
        enhancer.setCallback(this);
        enhancer.setSuperclass(targetObject.getClass());
        return enhancer.create();
    }

    @Override
    public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        long startTime = System.currentTimeMillis();
        Thread.sleep(100);
        Object result=methodProxy.invoke(targetObject, args);
        long endTime = System.currentTimeMillis();
        System.out.println("耗时"+(endTime-startTime)+"秒");
        System.out.println("结果+"+result);
        return result;
    }
}
相关文章
相关标签/搜索