spring aop学习8:spring对jdk和cglib动态代理的选择

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Tiglle/article/details/78397900

一.spring对jdk和cglib动态代理的选择
1.查看spring源码:
org.springframework.aop.framework.DefaultAopProxyFactory.java

createAopProxy(){}
方法:

@Override
    public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {
        //◆如果目标对象实现了接口,且强制cglib代理,则使用cglib代理
        if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) {
            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.");
            }
            //◆如果目标对象实现了接口,则采用JDK动态代理
            if (targetClass.isInterface()) {
                return new JdkDynamicAopProxy(config);
            }
            //◆如果目标对象没有实现接口,则采用Cglib动态代理
            return new ObjenesisCglibAopProxy(config);
        }
        else {
            return new JdkDynamicAopProxy(config);
        }
    }

2.得出结论:
◆如果目标对象实现了接口,则采用JDK动态代理
◆如果目标对象没有实现接口,则采用Cglib动态代理
◆如果目标对象实现了接口,且强制cglib代理,则使用cglib代理

展开阅读全文

没有更多推荐了,返回首页