springAop源码分析(三)

springAop源码分析(三)

一、接上篇博客,所有的切面方法都找到后,并缓存起来了,接下来应该如何,请看下图
在这里插入图片描述
二、源码分析

了解过getBean源码的对这里应该不陌生,本章将从这里开始:applyBeanPostProcessorsAfterInitialization

protected Object initializeBean(final String beanName, final Object bean, RootBeanDefinition mbd) {
    
    
		if (System.getSecurityManager() != null) {
    
    
			AccessController.doPrivileged(new PrivilegedAction<Object>() {
    
    
				@Override
				public Object run() {
    
    
					invokeAwareMethods(beanName, bean);
					return null;
				}
			}, getAccessControlContext());
		}
		else {
    
    
			invokeAwareMethods(beanName, bean);
		}

		Object wrappedBean = bean;
		if (mbd == null || !mbd.isSynthetic()) {
    
    
			wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
		}

		try {
    
    
			invokeInitMethods(beanName, wrappedBean, mbd);
		}
		catch (Throwable ex) {
    
    
			throw new BeanCreationException(
					(mbd != null ? mbd.getResourceDescription() : null),
					beanName, "Invocation of init method failed", ex);
		}
		if (mbd == null || !mbd.isSynthetic()) {
    
    
		   //本章分析从这里开始
			wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
		}
		return wrappedBean;
	}

在这里插入图片描述
至于为什么会执行此方法,因为AbstractAutoProxyCreator–》实现SmartInstantiationAwareBeanPostProcessor–》继承InstantiationAwareBeanPostProcessor–》继承BeanPostProcessor
在这里插入图片描述

protected Object wrapIfNecessary(Object bean, String beanName, Object cacheKey) {
    
    
		if (beanName != null && 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;
		}

		// Create proxy if we have advice.
		//核心方法,寻找增强器
		Object[] specificInterceptors = getAdvicesAndAdvisorsForBean(bean.getClass(), beanName, null);
		if (specificInterceptors != DO_NOT_PROXY) {
    
    
			this.advisedBeans.put(cacheKey, Boolean.TRUE);
			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;
	}
protected Object[] getAdvicesAndAdvisorsForBean(Class<?> beanClass, String beanName, TargetSource targetSource) {
    
    
		List<Advisor> advisors = findEligibleAdvisors(beanClass, beanName);
		if (advisors.isEmpty()) {
    
    
			return DO_NOT_PROXY;
		}
		return advisors.toArray();
	}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

下面这几段方法匹配的代码大致说明一下:循环增强器,获取PointcutAdvisor中的pointCut,获取pointCut中的方法选择器,匹配类中的方法,并不是每个方法都匹配,这一块主要是判断这个要代理的类是否含有该增强器(是对增强器的筛选),但是这个过程中筛选过的方法将存入AspectJExpressionPointcut类中的shadowMatchCache(说明:key是方法,value是ShadowMatch对象包含对方法的处理结果)缓存中。
在这里插入图片描述

@Override
	public boolean matches(Method method, Class<?> targetClass, boolean beanHasIntroductions) {
    
    
		checkReadyToMatch();
		Method targetMethod = AopUtils.getMostSpecificMethod(method, targetClass);
		ShadowMatch shadowMatch = getShadowMatch(targetMethod, method);

		// Special handling for this, target, @this, @target, @annotation
		// in Spring - we can optimize since we know we have exactly this class,
		// and there will never be matching subclass at runtime.
		if (shadowMatch.alwaysMatches()) {
    
    
			return true;
		}
		else if (shadowMatch.neverMatches()) {
    
    
			return false;
		}
		else {
    
    
			// the maybe case
			if (beanHasIntroductions) {
    
    
				return true;
			}
			// A match test returned maybe - if there are any subtype sensitive variables
			// involved in the test (this, target, at_this, at_target, at_annotation) then
			// we say this is not a match as in Spring there will never be a different
			// runtime subtype.
			RuntimeTestWalker walker = getRuntimeTestWalker(shadowMatch);
			return (!walker.testsSubtypeSensitiveVars() || walker.testTargetInstanceOfResidue(targetClass));
		}
	}
private ShadowMatch getShadowMatch(Method targetMethod, Method originalMethod) {
    
    
		// Avoid lock contention for known Methods through concurrent access...
		ShadowMatch shadowMatch = this.shadowMatchCache.get(targetMethod);
		if (shadowMatch == null) {
    
    
			synchronized (this.shadowMatchCache) {
    
    
				// Not found - now check again with full lock...
				PointcutExpression fallbackExpression = null;
				Method methodToMatch = targetMethod;
				shadowMatch = this.shadowMatchCache.get(targetMethod);
				if (shadowMatch == null) {
    
    
					try {
    
    
						try {
    
    
							shadowMatch = this.pointcutExpression.matchesMethodExecution(methodToMatch);
						}
						catch (ReflectionWorldException ex) {
    
    
							// Failed to introspect target method, probably because it has been loaded
							// in a special ClassLoader. Let's try the declaring ClassLoader instead...
							try {
    
    
								fallbackExpression = getFallbackPointcutExpression(methodToMatch.getDeclaringClass());
								if (fallbackExpression != null) {
    
    
									shadowMatch = fallbackExpression.matchesMethodExecution(methodToMatch);
								}
							}
							catch (ReflectionWorldException ex2) {
    
    
								fallbackExpression = null;
							}
						}
						if (shadowMatch == null && targetMethod != originalMethod) {
    
    
							methodToMatch = originalMethod;
							try {
    
    
								shadowMatch = this.pointcutExpression.matchesMethodExecution(methodToMatch);
							}
							catch (ReflectionWorldException ex3) {
    
    
								// Could neither introspect the target class nor the proxy class ->
								// let's try the original method's declaring class before we give up...
								try {
    
    
									fallbackExpression = getFallbackPointcutExpression(methodToMatch.getDeclaringClass());
									if (fallbackExpression != null) {
    
    
										shadowMatch = fallbackExpression.matchesMethodExecution(methodToMatch);
									}
								}
								catch (ReflectionWorldException ex4) {
    
    
									fallbackExpression = null;
								}
							}
						}
					}
					catch (Throwable ex) {
    
    
						// Possibly AspectJ 1.8.10 encountering an invalid signature
						logger.debug("PointcutExpression matching rejected target method", ex);
						fallbackExpression = null;
					}
					if (shadowMatch == null) {
    
    
						shadowMatch = new ShadowMatchImpl(org.aspectj.util.FuzzyBoolean.NO, null, null, null);
					}
					else if (shadowMatch.maybeMatches() && fallbackExpression != null) {
    
    
						shadowMatch = new DefensiveShadowMatch(shadowMatch,
								fallbackExpression.matchesMethodExecution(methodToMatch));
					}
					//将这个方法匹配的结果放入map中缓存
					this.shadowMatchCache.put(targetMethod, shadowMatch);
				}
			}
		}
		return shadowMatch;
	}

当前拦截器满足,直接加入到集合中
在这里插入图片描述
在这里插入图片描述
创建ProxyFactory并初始化,通过proxyFactory.getProxy(getProxyClassLoader());获取代理
在这里插入图片描述
在这里插入图片描述
==proxyFactory.getProxy(getProxyClassLoader())==以jdk代理为例

@Override
	public Object getProxy(ClassLoader classLoader) {
    
    
		if (logger.isDebugEnabled()) {
    
    
			logger.debug("Creating JDK dynamic proxy: target source is " + this.advised.getTargetSource());
		}
		//为给定的AOP配置确定代理的完整接口集。
		Class<?>[] proxiedInterfaces = AopProxyUtils.completeProxiedInterfaces(this.advised, true);
		//接口是否定义了 equals和hashcode方法 正常是没有的
		findDefinedEqualsAndHashCodeMethods(proxiedInterfaces);
		  //创建代理对象 this是JdkDynamicAopProxy  
        //JdkDynamicAopProxy 同时实现了InvocationHandler 接口
		return Proxy.newProxyInstance(classLoader, proxiedInterfaces, this);
	}
 public static Object newProxyInstance(ClassLoader loader,
                                          Class<?>[] interfaces,
                                          InvocationHandler h)
        throws IllegalArgumentException
    {
    
    
        Objects.requireNonNull(h);

        final Class<?>[] intfs = interfaces.clone();
        final SecurityManager sm = System.getSecurityManager();
        if (sm != null) {
    
    
            checkProxyAccess(Reflection.getCallerClass(), loader, intfs);
        }

        /*
         * Look up or generate the designated proxy class.
         */
          // 装载真实对象的类加载器与接口,获得 $Proxy0 类
        Class<?> cl = getProxyClass0(loader, intfs);

        /*
         * Invoke its constructor with the designated invocation handler.
         */
        try {
    
    
            if (sm != null) {
    
    
                checkNewProxyPermission(Reflection.getCallerClass(), cl);
            }

    // 使用反射获得构造器
            final Constructor<?> cons = cl.getConstructor(constructorParams);
            final InvocationHandler ih = h;
             // 检查真实角色的类是否是public可获取的
            if (!Modifier.isPublic(cl.getModifiers())) {
    
    
                AccessController.doPrivileged(new PrivilegedAction<Void>() {
    
    
                    public Void run() {
    
    
                     // 不是就强行破解权限,设置为可获取
                        cons.setAccessible(true);
                        return null;
                    }
                });
            }
  // 装载 实现了invoke()方法的InvocationHandler接口,与下面$Proxy0的构造方法一致
            return cons.newInstance(new Object[]{
    
    h});
        } catch (IllegalAccessException|InstantiationException e) {
    
    
            throw new InternalError(e.toString(), e);
        } catch (InvocationTargetException e) {
    
    
            Throwable t = e.getCause();
            if (t instanceof RuntimeException) {
    
    
                throw (RuntimeException) t;
            } else {
    
    
                throw new InternalError(t.toString(), t);
            }
        } catch (NoSuchMethodException e) {
    
    
            throw new InternalError(e.toString(), e);
        }
    }

举例说明

public final class $Proxy0
  extends Proxy
  implements Providable
{
    
    
  private static Method m1;

  private static Method m2;

  private static Method m0;

  public $Proxy0(InvocationHandler paramInvocationHandler)
  {
    
    
    super(paramInvocationHandler);
  }

  public final boolean equals(Object paramObject)
  {
    
    
    try
    {
    
    
      return ((Boolean)this.h.invoke(this, m1, new Object[] {
    
     paramObject })).booleanValue();
    }
    catch (Error|RuntimeException localError)
    {
    
    
      throw localError;
    }
    catch (Throwable localThrowable)
    {
    
    
      throw new UndeclaredThrowableException(localThrowable);
    }
  }


  public final String toString()
  {
    
    
    try
    {
    
    
      return (String)this.h.invoke(this, m2, null);
    }
    catch (Error|RuntimeException localError)
    {
    
    
      throw localError;
    }
    catch (Throwable localThrowable)
    {
    
    
      throw new UndeclaredThrowableException(localThrowable);
    }
  }



  public final int hashCode()
  {
    
    
    try
    {
    
    
      return ((Integer)this.h.invoke(this, m0, null)).intValue();
    }
    catch (Error|RuntimeException localError)
    {
    
    
      throw localError;
    }
    catch (Throwable localThrowable)
    {
    
    
      throw new UndeclaredThrowableException(localThrowable);
    }
  }

  static
  {
    
    
    try
    {
    
    
      m1 = Class.forName("java.lang.Object").getMethod("equals", new Class[] {
    
     Class.forName("java.lang.Object") });
      m2 = Class.forName("java.lang.Object").getMethod("toString", new Class[0]);
      m0 = Class.forName("java.lang.Object").getMethod("hashCode", new Class[0]);
      return;
    }
    catch (NoSuchMethodException localNoSuchMethodException)
    {
    
    
      throw new NoSuchMethodError(localNoSuchMethodException.getMessage());
    }
    catch (ClassNotFoundException localClassNotFoundException)
    {
    
    
      throw new NoClassDefFoundError(localClassNotFoundException.getMessage());
    }
  }
}

三总结,本章就到这里,具体的动态代理增强器如何调用,将再下一篇博客说明。

猜你喜欢

转载自blog.csdn.net/mlplds/article/details/103178990