Spring AOP动态代理实现原理

Spring Aop动态代理实现原理是由jdk动态代理和cglib动态字节码生成技术实现的。他的织入器是Spring提供的动态代理对象ProxyFactory; (使用jdk动态代理必须要有接口定义 类,cglib 只需要普通类即可)

1.静态代理模式

/**
 * 静态代理模式
 */
public class StaticProxyTest {

    //声明一个接口
    interface Itest {
        public void method();
    }
    //定义接口实现类
    static class TestImpl implements Itest{

        @Override
        public void method() {
            System.out.println("i am impl");
        }
    }

    //声明一个代理对象内含目标对象的接口引用
    static class ProxyTest implements Itest{
        private Itest itest;
        ProxyTest(Itest itest){
            this.itest = itest;
        }

        @Override
        public void method() {
            System.out.println("方法执行前处理逻辑");
            itest.method();
            System.out.println("方法执行后处理逻辑");
        }

    }

    public static void main(String[] args) {
        Itest itest = new TestImpl();
        ProxyTest proxyTest = new ProxyTest(itest);
        proxyTest.method();
    }

}

运行结果:

方法执行前处理逻辑
i am impl
方法执行后处理逻辑

2.jdk 动态代理模式

定义接口类及接口实现目标类

public interface IRequestCtr {
    public String getRequest();
}
public class RequestCtrImpl implements IRequestCtr {
    @Override
    public String getRequest() {
        System.out.println("运行方法");
        return "jia";
    }
}

定义InvocationHandler实现类

public class InverCtrHandler implements InvocationHandler {
    private Object target;

    public InverCtrHandler(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        System.out.println("代理前");
        method.invoke(target,args);
        System.out.println("代理后");
        return null;
    }
}

测试类

public class ProxyTest {
    public static void main(String[] args) {
        IRequestCtr reqProxy = (IRequestCtr)Proxy.newProxyInstance(ProxyTest.class.getClassLoader()
                , new Class[]{IRequestCtr.class}
                , new InverCtrHandler(new RequestCtrImpl()));

        reqProxy.getRequest();
        System.out.println(reqProxy.getClass().getName());
    }
}

运行结果:

代理前
运行方法
代理后
com.sun.proxy.$Proxy0

3.cglib 动态生成字节码方式生成目标对象的子类

import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyTest {
    public static void main(String[] args) {

        //cglib代理
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(RequestCtrImpl.class);
        enhancer.setCallback(new MethodInterceptor() {

            @Override
            public Object intercept(Object target, Method method, Object[] params, MethodProxy methodProxy) throws Throwable {
                System.out.println("cglib 代理运行前");
                Object result = methodProxy.invokeSuper(target, params);
                System.out.println("cglib 代理运行后");
                return result;
            }
        });
        Object o = enhancer.create();
        RequestCtrImpl o1 = (RequestCtrImpl) o;
        System.out.println(o1.getRequest());
        System.out.println(o);
    }
com.common.test.RequestCtrImpl$$EnhancerByCGLIB$$1706dfbb@53b32d7

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值