首页

文章

jdk动态代理和cglib的区别

发布网友 发布时间:2022-03-24 06:11

我来回答

2个回答

热心网友 时间:2022-03-24 07:40

关于动态代理和静态代理

当一个对象(客户端)不能或者不想直接引用另一个对象(目标对象),这时可以应用代理模式在这两者之间构建一个桥梁--代理对象。

按照代理对象的创建时期不同,可以分为两种:

静态代理:事先写好代理对象类,在程序发布前就已经存在了;

动态代理:应用程序发布后,通过动态创建代理对象。

静态代理其实就是一个典型的代理模式实现,在代理类中包装一个被代理对象,然后影响被代理对象的行为,比较简单,代码就不放了。

其中动态代理又可分为:JDK动态代理和CGLIB代理。

1.JDK动态代理

此时代理对象和目标对象实现了相同的接口,目标对象作为代理对象的一个属性,具体接口实现中,可以在调用目标对象相应方法前后加上其他业务处理逻辑。

代理模式在实际使用时需要指定具体的目标对象,如果为每个类都添加一个代理类的话,会导致类很多,同时如果不知道具体类的话,怎样实现代理模式呢?这就引出动态代理。

JDK动态代理只能针对实现了接口的类生成代理。

2.CGLIB代理

CGLIB(CODE GENERLIZE LIBRARY)代理是针对类实现代理,

主要是对指定的类生成一个子类,覆盖其中的所有方法,所以该类或方法不能声明称final的。

JDK动态代理和CGLIB代理生成的区别

JDK动态代理只能对实现了接口的类生成代理,而不能针对类 。
CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法 。
因为是继承,所以该类或方法最好不要声明成final ,final可以阻止继承和多态。

PS:final 所修饰的数据具有“终态”的特征,表示“最终的”意思:

热心网友 时间:2022-03-24 08:58

jdk动态代理举例如下:

public class JDKProxyimplements InvocationHandler{
private UserDao userDao;
 
public JDKProxy(UserDao userDao) {
    super();
    this.userDao = userDao;
}
 
public UserDao createProxy() {
        // 创建代理对象  
        // 1、定义代理类的类加载器  
        // 2、代理类要实现的接口列表  
        // 3、 指派方法调用的调用处理程序 
    UserDao proxy = (UserDao)Proxy.newProxyInstance(userDao.getClass()
            .getClassLoader(),userDao.getClass().getInterfaces(), this);
    return proxy;
}
 
// 调用目标对象的任何一个方法 都相当于调用invoke();
public Object invoke(Object proxy, Method method, Object[] args)
        throws Throwable {
    if("add".equals(method.getName())){
        // 记录日志:
        System.out.println("日志记录=================");
        Object result = method.invoke(userDao, args);
        return result;
    }
    returnmethod.invoke(userDao, args);
}
}

CGLIB(Code GenerationLibrary)是一个开源项目!是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口。Hibernate支持它来实现PO(Persistent Object 持久化对象)字节码的动态生成Hibernate生成持久化类的javassist.

CGLIB生成代理机制:其实生成了一个真实对象的子类.

 
public class CGLibProxyimplements MethodInterceptor{
private ProctDao proctDao;
 
public CGLibProxy(ProctDao proctDao) {
    super();
    this.proctDao =proctDao;
}

public ProctDao createProxy(){
    // 使用CGLIB生成代理:
    // 1.创建核心类:
    Enhancer enhancer = newEnhancer();
    // 2.为其设置父类:
    enhancer.setSuperclass(proctDao.getClass());
    // 3.设置回调:
    enhancer.setCallback(this);
    // 4.创建代理:
    return (ProctDao)enhancer.create();
}
 

public Object intercept(Object proxy, Method method, Object[] args,
        MethodProxy methodProxy) throws Throwable {
    if("add".equals(method.getName())){
        System.out.println("日志记录==============");
        Object obj = methodProxy.invokeSuper(proxy, args);
        return obj;
    }
    returnmethodProxy.invokeSuper(proxy, args);
}
}

结论:在Spring框架中,如果类实现了接口,就使用JDK的动态代理生成代理对象,如果这个类没有实现任何接口,使用CGLIB生成代理对象.

宝石花的养殖方法介绍 宝石花怎么养才长得好 不想让老婆看到我电脑里的一些东西怎么办? 桥好路由器停电后在来电老是获取lp 勒索病毒加密的文件如何恢复? TPU贴合膜多少钱 华为手机如何将输入法改为简体 肉丝炒金针菇做法 仓储冷链信息怎么申报 什么是药品冷链物流 浙江食品冷链运输多少钱 生物冷链具备什么资质 投诉检测站最有效办法 冢君的解释 304C型钢厂 真诚推荐 永浩供 乌鲁木齐球墨铸铁厂家排名 2023年抖音618好物节招商规则 2023年抖音好物年货节好物直播间玩法说明 抖音2023好物年货节玩法攻略 互联网内容平台——小红书的优势与困境 ...女儿房间的空调洗一下滤网,问一下格力小金豆空调面罩怎么打开... 传真机和打印机有什么区别? 传真纸和打印纸哪个好 传真纸和复印纸哪个好 虚拟语气as though 的问题 We didn't know his telephone number, otherwise we would have teleph... 我想问一下 错综复杂条件句 那怎么不能使用在这里 if i can do this... 好可怕...好可怕的梦... 线束组装线束组装工艺要求 汽车线束英语翻译 带表卡尺怎么读数 带表卡尺的使用方法 压力变送器数显表 公主连结凯露表情包大全 臭鼬表情包图片一览[多图] 单眼皮怎么使用双眼皮贴? 咬人的那特小的虫子叫什么 Bose音响怎么连接蓝牙 博士音响蓝牙怎么连接 夹了一片菜叶,上面摆了七根鱼刺和在碗里放了七个汤勺,每个汤勺里放一根... 微信聊天记录怎么才能彻底删除?通过这几种操作可以确保隐私安全!_百度... IDM IDMShellExt64.dll无法删除 - 删除使用中的(进程相关或残留)文件... 写关于活动的句子100字 社区团购运营思路和实战有啥收获写100字 备忘录在手机的哪里 刚性消费有哪些 中国经济快速增长的原因 什么是刚性消费 什么叫刚性增长 特别精辟的个性签名(非常经典的个性句子) 特别经典的个性签名(非常惊艳的个性句子) 文艺范十足的个性签名(温柔治愈的个性签名句子) wps文字怎么设置每页头和尾 27岁的女人需要补充哪些营养元素 动态住宅IP和静态住宅IP有什么区别?怎么选择? java动态代理和cglib动态代理的区别 什么是java代理模式,具体相关的动态代理和静态代理分别是什么?举例更好啦~ Java中的动态代理相对于静态代理有何优点? 静态代理,JDK动态代理和CGLib动态代理之前的区别 动态IP和静态IP的区别是什么? Java动态代理和静态代理的区别 Java动态代理与静态代理的定义与区别?? java静态代理与动态代理的区别 苹果xr闪退在上海黄浦区五福弄附近哪里能维修? 苹果XR为什么一打开王者一点就退是什么原因? IphoneXR昨天升级ios13后,微信qq闪退打不开怎么办 苹果Xr打开软件闪退提示已损坏但是修复不了是怎么回事? 苹果xr更新系统后微信打不开,闪退怎么解决? xr手机软件打不开闪退怎么回事 苹果xr王者荣耀闪退怎么解决 苹果xr更新14.3总是闪退 苹果XR又是系统点不开闪退是什么原因? 苹果为什么老是闪退 上海苹果维修:苹果xr闪退该怎么解决? Spring的两种动态代理有什么区别 什么是aop AOP是什么意思? Spring事务管理是动态代理还是静态代理? CGLB支持动态代理吗?因为我听老师说CGLB是静态代理 Spring AOP实践动态代理和静态代理,为什么使用AOP spring的动态代理有几种实现方式 Spring AOP 一般用在什么场景中 小米9开启开发者选项在哪里 小米9的开发者选项在哪里打开 小米9手机开发者选项在哪 小米9开发者选项在哪里怎么打开 小米9se开发者选项在哪 小米的开发者选项怎么不见了,应该去哪里找? 小米9怎么进入开发者模式 小米9开发者选项在哪里关闭 小米cc9pro怎么进入开发者选项 小米9开发者选项怎么开启 小米怎么找开发者选项 小米cc9开发者选项在哪 小米9pro开发者选项怎么打开
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com