栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

谈谈对Spring的动态代理机制

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

谈谈对Spring的动态代理机制

①:JDK动态代理

//接口
interface Demo{
    void buyCar();
}
//要被代理的类
public class PersonBuy implements Demo{
    @Override
    public void buyCar() {
        System.out.println("去4s店提车");
    }
}

//JDK代理类
class JDKProxy implements InvocationHandler {

private PersonBuy target;

    public  JDKProxy(PersonBuy target){
        this.target=target;
    }

    //重写invoke方法
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("先看看卡里有没有钱");
        Object returnValue= method.invoke(target,args);
        System.out.println("到了店里发现没卡里没钱");
        return returnValue;
    }
}

测试一下

class test {
    public static void main(String[] args) {
        PersonBuy dede=new PersonBuy();
        JDKProxy dedede= new JDKProxy(dede);
        Demo demo =(Demo)Proxy.newProxyInstance(dede.getClass().getClassLoader(),dede.getClass().getInterfaces(),dedede);
        demo.buyCar();
    }
}

JDK原生的动态代理有一个弊端,只能代理实现接口的类。
其代理类要是实现InvocationHandler接口,并重写invoke方法做切面处理。

②:CGLIB动态代理

    class Buy{
        public void buyCar (){
            System.out.println("今天非要买车不可");
        }
    }
     class CGlib implements MethodInterceptor{
        @Override
        public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
            System.out.println("先看看卡里有没有钱");
            Object returnResult=methodProxy.invokeSuper(o,objects);
            System.out.println("到了店里发现没卡里没钱");
            return  returnResult;
        }
    }

测试一下
 

class dded {
    public static void main2(String[] args) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(Buy.class);
        enhancer.setCallback(new CGlib());
        Buy buy=(Buy)enhancer.create();
        buy.buyCar();
    }
}

CGLIB的优点在于,可以代理任何除了final的普通类,其代理类是实现MethodInterceptor接口

其底层是通过利用ASM技术 直接编译到class内。
相比较JDK动态代理,CGLIB的动态代理更广泛一些。
Spring首先找到被代理的类是否实现接口,如果实现接口走JDK原生动态代理,如果没实现接口,走的就是CGLIB动态代理

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/531345.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号