Spring AOP-3 怎么生成代理类对象

一. 什么时候创建proxy bean

我们知道代理类是在 initializeBean() 的时候的 applyBeanPostProcessorsAfterInitialization() 中触发的,通过后处理器的 postProcessAfterInitialization() 生成的;

我们简单看下流程:

// --------------------- AbstractAutowireCapableBeanFactory ------------------
protected Object initializeBean(String beanName, Object bean, 
                                @Nullable RootBeanDefinition mbd) {
    // ...
    
    Object wrappedBean = bean;
    // 1. 轮询执行后置处理器的 postProcessBeforeInitialization()
    if (mbd == null || !mbd.isSynthetic()) {
        wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, 
                                                                  beanName);
    }

    try {
        // 2. 执行初始化方法
        invokeInitMethods(beanName, wrappedBean, mbd);
    }
    catch (Throwable ex) {
        throw new BeanCreationException();
    }
    
    // 3. 轮询执行后置处理器的 postProcessAfterInitialization()
    // 这里就是会触发生成代理类的地方
    // 将原始 bean 传进去,如果原始 Bean 需要代理的话会得到代理后的 bean 对象
    if (mbd == null || !mbd.isSynthetic()) {
        wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, 
                                                                 beanName);
    }

    return wrappedBean;
}



// --------------------- AbstractAutowireCapableBeanFactory ------------------
public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, 
                                                         String beanName) {
    // 轮询所有的后置处理器 BeanPostProcessor
    // 调它的 postProcessAfterInitialization(),得到处理后的对象并赋值给 result
    Object result = existingBean;
    for (BeanPostProcessor processor : getBeanPostProcessors()) {
        Object current = processor.postProcessAfterInitialization(result, beanName);
        if (current == null) {
            return result;
        }
        result = current;
    }
    return result;
}

那么,真正执行 AOP 代理的是哪个后置处理器 BeanPostProcessor 呢?是 AnnotationAwareAspectJAutoProxyCreator,它是一个具体的实现类,postProcessAfterInitialization() 得看它的抽象父类 AbstractAutoProxyCreator,下面我们简单看下 AbstractAutoProxyCreator#postProcessAfterInitialization();

二. 如何创建proxy bean

我们直接看 AbstractAutoProxyCreator#postProcessAfterInitialization() 的逻辑;

// -------------------------- AbstractAutoProxyCreator ------------------------
public Object postProcessAfterInitialization(@Nullable Object bean, String beanName) {
    if (bean != null) {
        Object cacheKey = getCacheKey(bean.getClass(), beanName);
        if (this.earlyProxyReferences.remove(cacheKey) != bean) {
            // 如果需要的话包装代理 bean 对象
            return wrapIfNecessary(bean, beanName, cacheKey);
        }
    }
    return bean;
}


// -------------------------- AbstractAutoProxyCreator ------------------------
protected Object wrapIfNecessary(Object bean, String beanName, Object cacheKey) {
    if (StringUtils.hasLength(beanName) &&
        this.targetSourcedBeans.contains(beanName)) {
        return bean;
    }
    if (Boolean.FALSE.equals(this.advisedBeans.get(cacheKey))) {
        return bean;
    }
    if (isInfrastructureClass(bean.getClass()) ||
        shouldSkip(bean.getClass(), beanName)) {
        this.advisedBeans.put(cacheKey, Boolean.FALSE);
        return bean;
    }

    // 1. 查找 Bean 对应的 Adivce
    // 如果有 Advice 的话,就会创建 Proxy 代理对象
    Object[] specificInterceptors =
        getAdvicesAndAdvisorsForBean(bean.getClass(), beanName, null);
    if (specificInterceptors != DO_NOT_PROXY) {
        this.advisedBeans.put(cacheKey, Boolean.TRUE);
        // 2. 创建代理类对象
        // 值得注意的是,这里创建了一个 SingletonTargetSource 对象,其内部包含了原始 bean 对象
        Object proxy = createProxy(bean.getClass(), beanName, specificInterceptors, 
                                   new SingletonTargetSource(bean));
        this.proxyTypes.put(cacheKey, proxy.getClass());
        return proxy;
    }

    this.advisedBeans.put(cacheKey, Boolean.FALSE);
    return bean;
}

其实就是两个步骤;

  1. 查找 Bean 对应的 Advices 和 Advisors:getAdvicesAndAdvisorsForBean();
  2. 创建代理类对象:createProxy();

1. getAdvicesAndAdvisorsForBean()

查找 Bean 对应的 Advice,如下:

// ------------------- AbstractAdvisorAutoProxyCreator ------------------
protected Object[] getAdvicesAndAdvisorsForBean(
    Class<?> beanClass, String beanName, @Nullable TargetSource targetSource) {

    // 查找符合条件的 Advisors
    List<Advisor> advisors = findEligibleAdvisors(beanClass, beanName);
    if (advisors.isEmpty()) {
        return DO_NOT_PROXY;
    }
    return advisors.toArray();
}



// ------------------- AbstractAdvisorAutoProxyCreator ------------------
protected List<Advisor> findEligibleAdvisors(Class<?> beanClass, String beanName) {
    // 1. 获取到所有的 Advisors
    List<Advisor> candidateAdvisors = findCandidateAdvisors();
    
    // 2. 获取符合条件的 Advisors
    List<Advisor> eligibleAdvisors = findAdvisorsThatCanApply(candidateAdvisors, 
                                                              beanClass, beanName);
    // 3. 对符合条件的 Advisors 进行扩展
    extendAdvisors(eligibleAdvisors);
    
    // 4. 对 Advisors 进行排序
    if (!eligibleAdvisors.isEmpty()) {
        eligibleAdvisors = sortAdvisors(eligibleAdvisors);
    }
    return eligibleAdvisors;
}

我们主要看第 2 点和第 3 点;

第 2 点:findAdvisorsThatCanApply(),我们关注 PointcutAdvisor 即可;

// -------------------------------- AopUtils -------------------------------
public static List<Advisor> findAdvisorsThatCanApply(List<Advisor> candidateAdvisors, 
                                                     Class<?> clazz) {
    if (candidateAdvisors.isEmpty()) {
        return candidateAdvisors;
    }
    List<Advisor> eligibleAdvisors = new ArrayList<>();
    for (Advisor candidate : candidateAdvisors) {
        if (candidate instanceof IntroductionAdvisor && canApply(candidate, clazz)) {
            eligibleAdvisors.add(candidate);
        }
    }
    boolean hasIntroductions = !eligibleAdvisors.isEmpty();
    for (Advisor candidate : candidateAdvisors) {
        if (candidate instanceof IntroductionAdvisor) {
            continue;
        }
        // candidate Advisor 是否能适配 clazz 对象,适配的话加入到 eligibleAdvisors 中
        if (canApply(candidate, clazz, hasIntroductions)) {
            eligibleAdvisors.add(candidate);
        }
    }
    return eligibleAdvisors;
}





// -------------------------------- AopUtils -------------------------------
public static boolean canApply(Advisor advisor, Class<?> targetClass, 
                               boolean hasIntroductions) {
    if (advisor instanceof IntroductionAdvisor) {
        return ((IntroductionAdvisor) advisor).getClassFilter().matches(targetClass);
    }
    else if (advisor instanceof PointcutAdvisor) {
        // 如果当前 advisor 对象是 PointcutAdvisor 类型,调用 canApply() 看是否适配 target
        PointcutAdvisor pca = (PointcutAdvisor) advisor;
        return canApply(pca.getPointcut(), targetClass, hasIntroductions);
    }
    else {
        return true;
    }
}



// -------------------------------- AopUtils -------------------------------
public static boolean canApply(Pointcut pc, Class<?> targetClass, 
                               boolean hasIntroductions) {
    // 1. pointcut 的类匹配器 ClassFilter 是否匹配 targetClass
    if (!pc.getClassFilter().matches(targetClass)) {
        return false;
    }

    // 2. pointcut 的方法匹配器 MethodMatcher 如果是 MethodMatcher.TRUE 表示都匹配
    MethodMatcher methodMatcher = pc.getMethodMatcher();
    if (methodMatcher == MethodMatcher.TRUE) {
        return true;
    }

    // 3. 获取目标类的所有接口
    Set<Class<?>> classes = new LinkedHashSet<>();
    if (!Proxy.isProxyClass(targetClass)) {
        classes.add(ClassUtils.getUserClass(targetClass));
    }
    classes.addAll(ClassUtils.getAllInterfacesForClassAsSet(targetClass));

    // 4. MethodMatcher 是否匹配目标类上的接口
    for (Class<?> clazz : classes) {
        Method[] methods = ReflectionUtils.getAllDeclaredMethods(clazz);
        for (Method method : methods) {
            if (introductionAwareMethodMatcher != null ?
                introductionAwareMethodMatcher.matches(method, targetClass) :
                methodMatcher.matches(method, targetClass)) {
                return true;
            }
        }
    }

    return false;
}

第 3 点,对符合条件的 Advisors 进行扩展;

这个方法挺有意思的,我们常见常用的 Advisor 是 AspectJ 的 Advisor,它会做一些扩展;

// --------------------- AspectJAwareAdvisorAutoProxyCreator ---------------------
protected void extendAdvisors(List<Advisor> candidateAdvisors) {
   AspectJProxyUtils.makeAdvisorChainAspectJCapableIfNecessary(candidateAdvisors);
}


// -------------------------- AspectJProxyUtils ---------------------------
static boolean makeAdvisorChainAspectJCapableIfNecessary(List<Advisor> advisors) {
    if (!advisors.isEmpty()) {
        boolean foundAspectJAdvice = false;
        for (Advisor advisor : advisors) {
            if (isAspectJAdvice(advisor)) {
                foundAspectJAdvice = true;
                break;
            }
        }
        
        // 如果是 AspectJAdvice,并且不包含 ExposeInvocationInterceptor.ADVISOR
        // 那么我们往 advisors 列表的第 0 个元素添加 ExposeInvocationInterceptor.ADVISOR	
        if (foundAspectJAdvice && 
            !advisors.contains(ExposeInvocationInterceptor.ADVISOR)) {
            advisors.add(0, ExposeInvocationInterceptor.ADVISOR);
            return true;
        }
    }
    return false;
}

这个 ExposeInvocationInterceptor.ADVISOR 值是啥呢,为啥要放在 advisors 列表的第 0 号元素;

我们知道 ExposeInvocationInterceptor.ADVISOR 一定是一个 Advisor 类对象,它的作用是启动 AOP 拦截器链路;如下:

public final class ExposeInvocationInterceptor implements MethodInterceptor {

    public static final ExposeInvocationInterceptor INSTANCE = new ExposeInvocationInterceptor();

    // 这个就是我们要的 ExposeInvocationInterceptor.ADVISOR
    // 它 new 了一个 DefaultPointcutAdvisor
    // Advice 为当前 MethodInterceptor 对象 ExposeInvocationInterceptor
    public static final Advisor ADVISOR = new DefaultPointcutAdvisor(INSTANCE) {
        @Override
        public String toString() {
            return ExposeInvocationInterceptor.class.getName() +".ADVISOR";
        }
    };

    // 线程变量,保存当前的 MethodInvocation 类对象
    private static final ThreadLocal<MethodInvocation> invocation =
        new NamedThreadLocal<>("Current AOP method invocation");


    /**
    * 获取当前的 MethodInvocation 类对象
    * 如果当前不是 AOP 代理对象的话,会抛出异常
    */
    public static MethodInvocation currentInvocation() throws IllegalStateException {
        MethodInvocation mi = invocation.get();
        if (mi == null) {
            throw new IllegalStateException();
        }
        return mi;
    }


    private ExposeInvocationInterceptor() {
    }

    /**
     * invoke(MethodInvocation mi) 是 MethodInterceptor 的抽象方法
     * 可以看到 ExposeInvocationInterceptor 的 invoke() 啥也没干,只是 mi.proceed()
     * 所以 ExposeInvocationInterceptor.ADVISOR 的作用其实就是启动 AOP 拦截器链路!!!
     */
    @Override
    public Object invoke(MethodInvocation mi) throws Throwable {
        MethodInvocation oldInvocation = invocation.get();
        invocation.set(mi);
        try {
            return mi.proceed();
        }
        finally {
            invocation.set(oldInvocation);
        }
    }
}

2. createProxy()

下面我们看 createProxy() 创建 Proxy 代理类对象的过程;

// ------------------------- AbstractAutoProxyCreator --------------------------
protected Object createProxy(Class<?> beanClass, @Nullable String beanName,
                             @Nullable Object[] specificInterceptors,
                             TargetSource targetSource) {
    if (this.beanFactory instanceof ConfigurableListableBeanFactory) {
        AutoProxyUtils.exposeTargetClass(this.beanFactory, beanName, beanClass);
    }

	// 1. 新建一个 ProxyFactory 对象
    // 可以看到,每次创建代理对象都是 new 一个 ProxyFactory 对象
    ProxyFactory proxyFactory = new ProxyFactory();
    proxyFactory.copyFrom(this);

    if (!proxyFactory.isProxyTargetClass()) {
        if (shouldProxyTargetClass(beanClass, beanName)) {
            proxyFactory.setProxyTargetClass(true);
        }
        else {
            evaluateProxyInterfaces(beanClass, proxyFactory);
        }
    }

    Advisor[] advisors = buildAdvisors(beanName, specificInterceptors);
    
    // 2. 添加 Advisors
    proxyFactory.addAdvisors(advisors);
    
    // 3. 设置 targetSource 目标对象
    // 这个 targetSource 包含了原始的 bean 对象,bean 对象类型等!!!
    proxyFactory.setTargetSource(targetSource);
    customizeProxyFactory(proxyFactory);

    proxyFactory.setFrozen(this.freezeProxy);
    if (advisorsPreFiltered()) {
        proxyFactory.setPreFiltered(true);
    }

    // 4. 通过 ProxyFactory.getProxy() 生成代理类对象
    // 我们主要看这一步
    return proxyFactory.getProxy(getProxyClassLoader());
}



// ----------------------------- ProxyFactory ------------------------------
public Object getProxy(@Nullable ClassLoader classLoader) {
    // 1. 获取 AopProxy 对象
    // 2. 调用 AopProxy 对象的 getProxy() 得到代理类对象
    return createAopProxy().getProxy(classLoader);
}

我们先看第 1 步,获取 AopProxy 对象;

// --------------------------- ProxyCreatorSupport ---------------------------
protected final synchronized AopProxy createAopProxy() {
    if (!this.active) {
        activate();
    }
    // 1. 获取 AopProxyFactory,一般都为默认的 DefaultAopProxyFactory
    // AopProxyFactory 也只有 DefaultAopProxyFactory 这一个实现类
    
    // 2. 调用 defaultAopProxyFactory.creaeAopProxy(this)
    // 这个 this 其实是 ProxyFactory 类对象
    // ProxyFactory 其实是 Advised、AdvisedSupport、ProxyCreatorSupport 等接口的实现类
    // 这个 proxyFactory 对象包含了代理类的各种信息,包括 Advisors,被代理原始 bean 对象等
    return getAopProxyFactory().createAopProxy(this);
}



// -------------------------- DefaultAopProxyFactory -------------------------
public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {
    if (config.isOptimize() || config.isProxyTargetClass() || 
        hasNoUserSuppliedProxyInterfaces(config)) {
        Class<?> targetClass = config.getTargetClass();
        if (targetClass == null) {
            throw new AopConfigException();
        }
        if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) {
            // 如果是接口类型采用 Jdk 动态代理类
            return new JdkDynamicAopProxy(config);
        }
        // 如果 target 没有实现任何接口,采用 Cglib 动态代理类
        return new ObjenesisCglibAopProxy(config);
    }
    else {
        // 其他情况也采用 Jdk 动态代理类
        return new JdkDynamicAopProxy(config);
    }
}

再看第 2 步,调用 AopProxy 对象的 getProxy() 获取代理类对象;

我们知道有 Jdk 动态代理类 JdkDynamicAopProxy 和 Cglib 动态代理类 ObjenesisCglibAopProxy,其实都是大同小异的,我们看它们的 getProxy() 是怎么生成代理类对象的;

2.1 JdkDynamicAopProxy

Jdk 的动态代理,值得注意的是 JdkDynamicAopProxy 不仅是 AopProxy 接口的实现类,也是 Jdk 动态代理中最经典的 InvocationHandler 接口的实现类;

所以我们既要关注作为 AopProxy 接口实现类的 getProxy(),也要关注作为 InvocationHandler 接口实现类的 invoke();

1、我们先来看它作为 AopProxy 接口实现类的 getProxy(),下面解释了为啥 Spring 生成的代理类对象都可以转换为 Advised 接口,原因是会让生成的代理类实现 Advised 接口!

// -------------------------- JdkDynamicAopProxy ---------------------------
@Override
public Object getProxy(@Nullable ClassLoader classLoader) {
    // 1. 获取被代理类的接口
    // 这里不仅仅获取被代理类本身实现的接口,Spring 还会往其加入几个接口
    Class<?>[] proxiedInterfaces = AopProxyUtils.completeProxiedInterfaces(this.advised, true);
    findDefinedEqualsAndHashCodeMethods(proxiedInterfaces);
    
    // 2. 通过 Jdk 动态代理经典的 Proxy.newProxyInstance() 创建代理对象
    // 可以看到,传的 InvocationHandler 对象就是 this,也就是 JdkDynamicAopProxy
    return Proxy.newProxyInstance(classLoader, proxiedInterfaces, this);
}



// --------------------------- AopProxyUtils ----------------------------- 
static Class<?>[] completeProxiedInterfaces(AdvisedSupport advised, 
                                            boolean decoratingProxy) {
    Class<?>[] specifiedInterfaces = advised.getProxiedInterfaces();
    if (specifiedInterfaces.length == 0) {
        Class<?> targetClass = advised.getTargetClass();
        if (targetClass != null) {
            if (targetClass.isInterface()) {
                advised.setInterfaces(targetClass);
            }
            else if (Proxy.isProxyClass(targetClass)) {
                advised.setInterfaces(targetClass.getInterfaces());
            }
            specifiedInterfaces = advised.getProxiedInterfaces();
        }
    }
    
    // 如果被代理类没有实现 SpringProxy、Advised 接口的话,往里塞入这俩接口
    // 	其中,DecoratingProxy 接口暂时不知道意义是啥
    // 	一般 JdkDynamicAopProxy 生成的代理类会实现该接口,Cglib 的不会
    boolean addSpringProxy = !advised.isInterfaceProxied(SpringProxy.class);
    boolean addAdvised = !advised.isOpaque() && 
        !advised.isInterfaceProxied(Advised.class);
    boolean addDecoratingProxy = (decoratingProxy && 
                                  !advised.isInterfaceProxied(DecoratingProxy.class));
    int nonUserIfcCount = 0;
    if (addSpringProxy) {
        nonUserIfcCount++;
    }
    if (addAdvised) {
        nonUserIfcCount++;
    }
    if (addDecoratingProxy) {
        nonUserIfcCount++;
    }
    Class<?>[] proxiedInterfaces = new Class<?>[specifiedInterfaces.length + nonUserIfcCount];
    System.arraycopy(specifiedInterfaces, 0, proxiedInterfaces, 0, specifiedInterfaces.length);
    int index = specifiedInterfaces.length;
    
    // 代理类需要实现的接口中,加入 SpringProxy、Advised 接口
    if (addSpringProxy) {
        proxiedInterfaces[index] = SpringProxy.class;
        index++;
    }
    if (addAdvised) {
        proxiedInterfaces[index] = Advised.class;
        index++;
    }
    if (addDecoratingProxy) {
        proxiedInterfaces[index] = DecoratingProxy.class;
    }
    return proxiedInterfaces;
}

2、再来看它作为 InvocationHandler 接口实现类的 invoke();

核心方法是找到匹配当前方法 method 的 advisors,创建一个 ReflectiveMethodInvocation 对象,并调用该对象的 proceed() 执行调用链;

对于 MethodInvocation#proceed() 后面我们还会细讲;

// -------------------------- JdkDynamicAopProxy ---------------------------
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    Object oldProxy = null;
    boolean setProxyContext = false;

    TargetSource targetSource = this.advised.targetSource;
    Object target = null;

    try {
        if (!this.equalsDefined && AopUtils.isEqualsMethod(method)) {
            return equals(args[0]);
        }
        else if (!this.hashCodeDefined && AopUtils.isHashCodeMethod(method)) {
            return hashCode();
        }
        else if (method.getDeclaringClass() == DecoratingProxy.class) {
            return AopProxyUtils.ultimateTargetClass(this.advised);
        }

        Object retVal;

        // 是否暴露 AOP 对象到当前线程变量 AopContext 中
        // 需要打开 advised.exposeProxy 配置开关
        // 常用于解决 this.proxyMethod() 中调用了 this.proxyMethod() 的问题,了解即可!
        if (this.advised.exposeProxy) {
            oldProxy = AopContext.setCurrentProxy(proxy);
            setProxyContext = true;
        }

        // target 为原始 bean 对象
        target = targetSource.getTarget();
        Class<?> targetClass = (target != null ? target.getClass() : null);

        // 1. 根据方法和目标类获取匹配的 advisors
        // 该方法是核心方法,查找符合 method 的 advisors
        // 我们在 ProxyFactory 中其实已经把对应的 eligibleAdvisors 设置进去了
        // 只不过在调用代理类对象方法的时候需要对 eligibleAdvisors 进行筛选过滤
        //	我们就不点这个方法了,有兴趣可以点进去看看
        List<Object> chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass);

        if (chain.isEmpty()) {
            // 2.1 如果没有匹配到 advisor
            // 直接通过反射调用目标类的方法 method.invoke(target, args)
            Object[] argsToUse = AopProxyUtils.adaptArgumentsIfNecessary(method,args);
            retVal = AopUtils.invokeJoinpointUsingReflection(target,method,argsToUse);
        }
        else {
            // 2.2 匹配到了 advisor
            // new 了一个 ReflectiveMethodInvocation 对象
            //	且执行 MethodInvocation 的 proceed()
            MethodInvocation invocation =
                new ReflectiveMethodInvocation(proxy, target, method, args, 
                                               targetClass, chain);
            retVal = invocation.proceed();
        }

        // ...
        return retVal;
    }
    finally {
        if (target != null && !targetSource.isStatic()) {
            targetSource.releaseTarget(target);
        }
        if (setProxyContext) {
            AopContext.setCurrentProxy(oldProxy);
        }
    }
}

2.2 ObjenesisCglibAopProxy

Cglib 的动态代理,通过上面我们知道,直接 new 了一个 ObjenesisCglibAopProxy,并调用它的 getProxy() 生成代理类对象,我们直接看 ObjenesisCglibAopProxy;

ObjenesisCglibAopProxy 继承了 CglibAopProxy,它的 getProxy() 在它的父类 CglibAopProxy 上;

CglibAopProxy 只实现了 AopProxy 接口,我们直接看它的 getProxy();

// ----------------------------- CglibAopProxy ----------------------------
public Object getProxy(@Nullable ClassLoader classLoader) {
    try {
        Class<?> rootClass = this.advised.getTargetClass();
        Assert.state(rootClass != null);

        Class<?> proxySuperClass = rootClass;
        if (rootClass.getName().contains(ClassUtils.CGLIB_CLASS_SEPARATOR)) {
            proxySuperClass = rootClass.getSuperclass();
            Class<?>[] additionalInterfaces = rootClass.getInterfaces();
            for (Class<?> additionalInterface : additionalInterfaces) {
                this.advised.addInterface(additionalInterface);
            }
        }

        validateClassIfNecessary(proxySuperClass, classLoader);

        // 创建 Cglib 动态代理经典的 Enhancer 类对象
        Enhancer enhancer = createEnhancer();
        if (classLoader != null) {
            enhancer.setClassLoader(classLoader);
            if (classLoader instanceof SmartClassLoader &&
                ((SmartClassLoader) classLoader).isClassReloadable(proxySuperClass)) {
                enhancer.setUseCache(false);
            }
        }
        enhancer.setSuperclass(proxySuperClass);
        
        // 设置代理类需要实现的接口,Spring 会往里添加 SpringProxy 和 Advised 接口
        // 这里和 JdkDynamicAopProxy 类似
        enhancer.setInterfaces(AopProxyUtils.completeProxiedInterfaces(this.advised));
        enhancer.setNamingPolicy(SpringNamingPolicy.INSTANCE);
        enhancer.setStrategy(new ClassLoaderAwareGeneratorStrategy(classLoader));

        // 1. 获取 Callbacks
        // Callback 是 Cglib 中最重要的类,一般是 MethodInterceptor 类对象
        // 要注意一点,这里说的 MethodInterceptor 是 Cglib 里的,不是 SpringAOP 里的
        // 这里会获取到多个 callback
        // 我们主要关心和 SpringAOP 相关的那个 Callback
        Callback[] callbacks = getCallbacks(rootClass);
        Class<?>[] types = new Class<?>[callbacks.length];
        for (int x = 0; x < types.length; x++) {
            types[x] = callbacks[x].getClass();
        }
    
        // 设置 CallbackFilter
        // 多个 Callbacks 能一起工作的原因是有 CallbackFilter
        // 对于代理类的指定方法,通过该 filter 选择指定的 callback 对代理类方法进行拦截增强
        enhancer.setCallbackFilter(new ProxyCallbackFilter(
            this.advised.getConfigurationOnlyCopy(), 
            this.fixedInterceptorMap, 
            this.fixedInterceptorOffset));
        enhancer.setCallbackTypes(types);

        // 2. 通过 enhancer 和 callbacks 生成代理类对象
        return createProxyClassAndInstance(enhancer, callbacks);
    }
    catch (CodeGenerationException | IllegalArgumentException ex) {
        throw new AopConfigException();
    }
    catch (Throwable ex) {
        throw new AopConfigException("Unexpected AOP exception", ex);
    }
}

对于第 1 步,会获取多个 Callback,我们关注和 AOP 有关的 Callback:DynamicAdvisedInterceptor;

// ----------------------------- CglibAopProxy ---------------------------
private Callback[] getCallbacks(Class<?> rootClass) throws Exception {
    boolean exposeProxy = this.advised.isExposeProxy();
    boolean isFrozen = this.advised.isFrozen();
    boolean isStatic = this.advised.getTargetSource().isStatic();

    // 创建和 AOP 有关的 DynamicAdvisedInterceptor
    // 构造函数中传入了 this.advised 对象,也就是 proxyFactory 对象
    Callback aopInterceptor = new DynamicAdvisedInterceptor(this.advised);
	
    // 创建其他 Callback 对象
    // ...

	// 可以看到 callbacks 不仅有 aopIntercetor,还有其他的
    // 比较容易理解的有 EqualsInterceptor、HashCodeInterceptor 和 targetInterceptor 等
    Callback[] mainCallbacks = new Callback[] {
        aopInterceptor,  // for normal advice
        targetInterceptor,  // invoke target without considering advice, if optimized
        new SerializableNoOp(),  // no override for methods mapped to this
        targetDispatcher, this.advisedDispatcher,
        new EqualsInterceptor(this.advised),
        new HashCodeInterceptor(this.advised)
    };

    Callback[] callbacks;

    if (isStatic && isFrozen) {
        // ...
    } else {
        callbacks = mainCallbacks;
    }
    return callbacks;
}

对于第 2 步,通过 enhancer 和 callbacks 生成代理类对象;

protected Object createProxyClassAndInstance(Enhancer enhancer, Callback[] callbacks) {
    // 调用 enhancer.setCallbacks(),并调用 enhancer.create() 生成代理类对象
    enhancer.setInterceptDuringConstruction(false);
    enhancer.setCallbacks(callbacks);
    return (this.constructorArgs != null && this.constructorArgTypes != null ?
            enhancer.create(this.constructorArgTypes, this.constructorArgs) :
            enhancer.create());
}

和 AOP 有关的 Callback 是 DynamicAdvisedInterceptor,该类是 CglibAopProxy 的静态内部类;

DynamicAdvisedInterceptor 实现了 Cglib 包的 MethodInterceptor,实现了它的 invoke(),我们直接看它的 invoke();其实它的 invoke() 和 JdkDynamicAopProxy 的 invoke() 类似,都是先找到符合条件的 advisors,然后创建一个 MethodInvocation,指定 methodInvocation 的 proceed();

private static class DynamicAdvisedInterceptor implements MethodInterceptor {

    private final AdvisedSupport advised;

    // 构造方法,传入 AdvisedSupport 类对象,一般是我们的 ProxyFactory 对象
    public DynamicAdvisedInterceptor(AdvisedSupport advised) {
        this.advised = advised;
    }

    @Override
    public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        Object oldProxy = null;
        boolean setProxyContext = false;
        Object target = null;
        TargetSource targetSource = this.advised.getTargetSource();
        try {
            
        	// 是否将代理类对象暴露到 AopContext 线程变量上
            if (this.advised.exposeProxy) {
                oldProxy = AopContext.setCurrentProxy(proxy);
                setProxyContext = true;
            }

            target = targetSource.getTarget();
            Class<?> targetClass = (target != null ? target.getClass() : null);
            
            // 1. 根据方法和目标类获取匹配的 advisors
        	// 该方法是核心方法,查找符合 method 的 advisors
        	// 我们在 ProxyFactory 中其实已经把对应的 eligibleAdvisors 设置进去了
        	// 只不过在调用代理类对象方法的时候需要对 eligibleAdvisors 进行筛选过滤
        	// 和 Jdk 动态代理调用的是同一个方法
            List<Object> chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method,targetClass);
            Object retVal;

            if (chain.isEmpty() && Modifier.isPublic(method.getModifiers())) {
                // 2.1 如果没有符合条件的 advisors,反射调用目标方法
                Object[] argsToUse = AopProxyUtils.adaptArgumentsIfNecessary(method,
                                                                             args);
                retVal = methodProxy.invoke(target, argsToUse);
            }
            else {
                // 2.2 有符合条件的 advisors
                // new 了一个 CglibMethodInvocation,并执行它的 proceed()
                
                // JdkDynamicAopProxy 创建的是 ReflectiveMethodInvocation
                // DynamicAdvisedInterceptor 创建的是 CglibMethodInvocation
                // 其实两者差不多,CglibMethodInvocation继承了ReflectiveMethodInvocation
                // 我们在看源码的时候,可以认为调用的都是 ReflectiveMethodInvocation
                retVal = new CglibMethodInvocation(proxy, target, method, args, targetClass, chain, methodProxy).proceed();
            }
            retVal = processReturnType(proxy, target, method, retVal);
            return retVal;
        }
        finally {
            if (target != null && !targetSource.isStatic()) {
                targetSource.releaseTarget(target);
            }
            if (setProxyContext) {
                AopContext.setCurrentProxy(oldProxy);
            }
        }
    }

}

至此,生成代理类对象的流程结束。

  • 10
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值