文档章节

Spring中JDK动态代理和Cglib代理的区别

王子城
 王子城
发布于 2018/08/01 15:51
字数 597
阅读 1234
收藏 5

    Spring的AOP基于代理模式,并且它即使用到了JDK动态代理也使用了Cglib代理。

    如下代码是springAOP中默认的代理实现类DefaultAopProxyFactory,其中创建代理的方法createAopProxy,在这个方法中Spring通过判断targetClass是否有实现接口来确定使用哪一种代理,如果实现了接口则使用JDK动态代理,如果没有实现接口则使用Cglib代理。同时JdkDynamicAopProxy为JDK动态代理的生成类,ObjenesisCglibAopProxy可以生成Cglib代理。

public class DefaultAopProxyFactory implements AopProxyFactory, Serializable {
    public DefaultAopProxyFactory() {
    }

	//创建代理
    public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {
        if (!config.isOptimize() && !config.isProxyTargetClass() && !this.hasNoUserSuppliedProxyInterfaces(config)) {
            return new JdkDynamicAopProxy(config);//生成JDK动态代理
        } else {
            Class<?> targetClass = config.getTargetClass();
            if (targetClass == null) {
                throw new AopConfigException("TargetSource cannot determine target class: Either an interface or a target is required for proxy creation.");
            } else {//ObjenesisCglibAopProxy生成Cglib代理
                return (AopProxy)(!targetClass.isInterface() && !Proxy.isProxyClass(targetClass) ? new ObjenesisCglibAopProxy(config) : new JdkDynamicAopProxy(config));
            }
        }
    }

    private boolean hasNoUserSuppliedProxyInterfaces(AdvisedSupport config) {
        Class<?>[] ifcs = config.getProxiedInterfaces();
        return ifcs.length == 0 || ifcs.length == 1 && SpringProxy.class.isAssignableFrom(ifcs[0]);
    }
}

    从上面代码可以发现当需要被代理的类实现了接口的时候Spring会使用动态代理,当被代理的类没有接口实现的时候使用的是Cglib,我们也可以强制使用CGlib,在spring配置中加入<aop:aspectj-autoproxy proxy-target-class="true"/>。

    性能问题:由于Cglib代理是利用ASM字节码生成框架在内存中生成一个需要被代理类的子类完成代理,而JDK动态代理是利用反射原理完成动态代理,所以Cglib创建的动态代理对象性能比JDk动态代理动态创建出来的代理对象新能要好的多,但是对象创建的速度比JDk动态代理要慢,所以,当Spring使用的是单例情况下可以选用Cglib代理,反之使用JDK动态代理更加合适。同时还有一个问题,被final修饰的类只能使用JDK动态代理,因为被final修饰的类不能被继承,而Cglib则是利用的继承原理实现代理的。

关于动态代理请参考:https://my.oschina.net/zicheng/blog/1920396

© 著作权归作者所有

上一篇: Spring IoC概念
下一篇: 代理模式
王子城
粉丝 11
博文 47
码字总数 36485
作品 0
武汉
程序员
私信 提问
动态代理:JDK动态代理和CGLIB代理的区别

本文转载自:动态代理:JDK动态代理和CGLIB代理的区别 代理模式:代理类和被代理类实现共同的接口(或继承),代理类中存有指向被代理类的索引,实际执行时通过调用代理类的方法、实际执行的是...

淡淡的倔强
2018/09/07
0
0
Spring AOP 创建代理的源码解析

相关文章 Spring AOP 注解方式源码解析 Spring AOP 功能使用详解 Spring 的 getBean 方法源码解析 Spring bean 创建过程源码解 Spring 中 bean 注册的源码解析 前言 在上篇文章 Spring AOP 注...

TSMYK
01/01
152
0
Java设计模式综合运用(动态代理+Spring AOP)

AOP设计模式通常运用在日志,校验等业务场景,本文将简单介绍基于Spring的AOP代理模式的运用。 1. 代理模式 1.1 概念 代理(Proxy)是一种提供了对目标对象另外的访问方式,即通过代理对象访问...

landy8530
2018/10/05
0
0
spring基础知识---AOP动态代理原理

Spring Boot实践——Spring AOP实现之动态代理 Spring AOP 介绍   AOP的介绍可以查看 Spring Boot实践——AOP实现   与AspectJ的静态代理不同,Spring AOP使用的动态代理,所谓的动态代理...

spinachgit
02/21
180
0
Spring Proxy 动态代理(ProxyFactory)

一、动态代理生成技术栈分为两种: 1、JDK动态代理 JDK动态代理只能对实现了接口的类生成代理,而不能针对类 2、Cglib动态代理 CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其...

王微_1986
2018/07/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

颠覆微服务认知:深入思考微服务的七个主流观点

一、逃离单体系统,拥抱微服务? 单体系统和微服务的区别在于,一个单体系统是一个大而全的功能集合,每个服务器运行的是这个应用的完整服务。而微服务是独立自治的功能模块,它是生态系统中...

别打我会飞
22分钟前
3
0
解决GitHub下载慢问题,不用修改HOSTS文件

本文链接:https://blog.csdn.net/github_37847975/article/details/86477343 写这篇文章缘由是我用的一款Github上的软件软件版本更新,想去Github上下载新的版本,结果下载速度居然只有几k...

shzwork
28分钟前
4
0
如何查看ubuntu的版本

cat /etc/issue

南桥北木
51分钟前
3
0
Checkstyle的style

checkstyle是什么? 是代码规范检查,关于各种格式的利弊这里就不说了,但是业内有一些总结的规范利于goole或者阿里有自己的代码规范,就需要用到checkstyle。我个人很讨厌这东西,奈何项目再...

stayStand
59分钟前
8
0
左边竖条的实现方法

下面这个图形,只使用一个标签,可以有多少种实现方式: 假设我们的单标签是一个 div : 1 < div > div> 定义如下通用CSS: 1 2 3 4 5 6 div{ position : relative ; width : 200px ; height ...

前端老手
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部