zoukankan      html  css  js  c++  java
  • spring 代理

    java动态代理实现

    1. Java自带的动态代理,反射生成字节码

    2. Cglib调用asm生成子类

    spring 中代理实现

    1. 如果类实现了接口,使用java动态代理

    2. 没有实现接口,使用cglib,生成子类字节码

    原因:

    1. jdk自带动态代理性能比cglib较好(待确认)

    2. jdk自带动态代理,需要继承接口,不够灵活

    spring 代理对象生成源码

    public class DefaultAopProxyFactory implements AopProxyFactory, Serializable {
    
        @Override
        public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {
            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.");
                }
                if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) {
                    return new JdkDynamicAopProxy(config);
                }
                return new ObjenesisCglibAopProxy(config);
            }
            else {
                return new JdkDynamicAopProxy(config);
            }
        }

    代码可以很清楚看到,什么时候使用jdk动态代理,什么时候使用cglib

  • 相关阅读:
    KMP算法
    快速排序的三种分区方法
    广义表
    外部排序(败者树、置换-选择排序、最佳归并树)
    内部排序
    散列表
    B树和B+树
    查找(顺序、折半、分块)
    关键路径
    拓扑排序
  • 原文地址:https://www.cnblogs.com/luckygxf/p/9510600.html
Copyright © 2011-2022 走看看