SpringBoot中的Aop优先使用的是JDK动态代理还是Cglib

SpringBoot的AOP在对象有接口时使用JDK动态代理,无接口时使用Cglib。官方文档表明首选JDK代理。在2.2.0.RELEASE之前,未配置时默认使用Cglib,之后默认使用JDK。可以通过配置启用Cglib代理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SpringAop 的实现

  • 如果代理对象有接口,就用 JDK 动态代理JDK 动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法时,会先调用实现了 InvokeHandler 接口的 invoke() 方法,来实现业务增强
  • 如果代理对象没有接口,那么就直接使用 Cglib 动态代理Cglib 动态代理是利用 asm 开源包,对代理对象类的 class 文件加载进来,通过修改其字节码生成子类来处理

来自 Spring 官方文档的说辞

在这里插入图片描述
可以看到,即使在最新版的 Spring 中,依然是如上策略不变。即能用 JDK 做动态代理就用 JDK,不能用 JDK 做动态代理就用 Cglib,即首选 JDK 做动态代理

Spring 中代理对象产生的源码

DefaultAopProxyFactory 类的 createAopProxy() 方法,具体源码可以参考

@Override
public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {
   

    if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) {
   
        // 获得被代理对象的类型,以确定代理的方式
        Class<?> targetClass = config.getTargetClass();
        // 如果对象类型是接口,或者是JAVA的动态代理类,那么就调用JDK的动态代理方法生成代理对象
        if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) {
   
            return new JdkDynamicAopProxy(config);
        }
        // 否则使用CGLIB生成代理对象
        return new ObjenesisCglibAopProxy(config);
    }
    else {
   
        return new JdkDynamicAopProxy(config);
    }
}

SpringBootAop 的实现

SpringBootSpring 一脉相承,那么在动态代理这个问题上是否也是相同的策略呢?抱歉,这个还真不一样,SpringBoot 中对这个问题的处理,以 SpringBoot 2.0 为节点,前后不一样

SpringBoot 2.0 之前

关于 Aop 的自动化配置代码是这样的(SpringBoot 1.5.22.RELEASE

@Configuration
@ConditionalOnClass({
    EnableAspectJAutoProxy.class, 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值