createProxy
protected Object createProxy(Class<?> beanClass, @Nullable String beanName, @Nullable Object[] specificInterceptors, TargetSource targetSource) { ProxyFactory proxyFactory = new ProxyFactory(); proxyFactory.copyFrom(this); // 将specificInterceptors(现在是Object)转化为Advisor返回 Advisor[] advisors = buildAdvisors(beanName, specificInterceptors); // 赋值到proxyFactory的advisors属性中 proxyFactory.addAdvisors(advisors); proxyFactory.setTargetSource(targetSource); customizeProxyFactory(proxyFactory); // 创建动态代理 return proxyFactory.getProxy(getProxyClassLoader()); }
proxyFactory.getProxy
public Object getProxy(@Nullable ClassLoader classLoader) { // 创建代理对象 return createAopProxy().getProxy(classLoader); }
createAopProxy
protected final synchronized AopProxy createAopProxy() { // 创建AOP代理对象 return getAopProxyFactory().createAopProxy(this); }
public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException { // @EnableAspectJAutoProxy的proxyTargetClass是否配置为true 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() || Proxy.isProxyClass(targetClass)) { return new JdkDynamicAopProxy(config); } // cglib动态代理 return new ObjenesisCglibAopProxy(config); } // 默认是jdk动态代理 else { return new JdkDynamicAopProxy(config); } }
public Object getProxy(@Nullable ClassLoader classLoader) { // 获取到代理的接口 Class<?>[] proxiedInterfaces = AopProxyUtils.completeProxiedInterfaces(this.advised, true); findDefinedEqualsAndHashCodeMethods(proxiedInterfaces); // 创建jdk代理,传入的为JdkDynamicAopProxy对象,里面包含了被代理的bean以及匹配的advisor return Proxy.newProxyInstance(classLoader, proxiedInterfaces, this); }
动态代理创建完成~
代理对象调用过程
对象都给你创建好了,接下当然是开…发起调用咯
以下是调用的大致流程图
代理对象调用过程
代理对象被调用的是invoke方法,我们所创建的代理对象为JdkDynamicAopProxy
,所以
JdkDynamicAopProxy#invoke
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object oldProxy = null; boolean setProxyContext = false; // 取出包装了被代理bean的对象->创建代理对象时的SingletonTargetSource, advised为ProxyFactory TargetSource targetSource = this.advised.targetSource; Object target = null; // 拿到bean target = targetSource.getTarget(); Class<?> targetClass = (target != null ? target.getClass() : null); // 将所有advisor中的advice取出,并转化为对应的interceptor List<Object> chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass); // 创建一个最外层的MethodInvocation用于发起调用 MethodInvocation invocation = new ReflectiveMethodInvocation(proxy, target, method, args, targetClass, chain); // 发起链式调用 Object retVal = invocation.proceed(); return retVal; }
我们先看获取interceptor的过程
getInterceptorsAndDynamicInterceptionAdvice
public List<Object> getInterceptorsAndDynamicInterceptionAdvice(Method method, @Nullable Class<?> targetClass) { // 将所有advisor中的advice取出并封装成intercept return this.advisorChainFactory.getInterceptorsAndDynamicInterceptionAdvice(this, method, targetClass); }
public List<Object> getInterceptorsAndDynamicInterceptionAdvice( Advised config, Method method, @Nullable Class<?> targetClass) { // 创建一个advisor适配器的注册器用于转化advice,创建时将默认注册三个适配器 AdvisorAdapterRegistry registry = GlobalAdvisorAdapterRegistry.getInstance(); Advisor[] advisors = config.getAdvisors(); // 循环遍历所有advisor for (Advisor advisor : advisors) { // 将advisor中的advice转化为interceptor MethodInterceptor[] interceptors = registry.getInterceptors(advisor); interceptorList.addAll(Arrays.asList(interceptors)); return interceptorList; } }
GlobalAdvisorAdapterRegistry.getInstance() 类初始化时调用静态方法
private static AdvisorAdapterRegistry instance = new DefaultAdvisorAdapterRegistry() public static AdvisorAdapterRegistry getInstance() { return instance; }
public DefaultAdvisorAdapterRegistry() { // 注册三个适配器 registerAdvisorAdapter(new MethodBeforeAdviceAdapter()); registerAdvisorAdapter(new AfterReturningAdviceAdapter()); registerAdvisorAdapter(new ThrowsAdviceAdapter()); }
public void registerAdvisorAdapter(AdvisorAdapter adapter) { // 将适配器加入集合 this.adapters.add(adapter); }
registry.getInterceptors 这里面包含了advice转化成interceptor的过程
public MethodInterceptor[] getInterceptors(Advisor advisor) throws UnknownAdviceTypeException { List<MethodInterceptor> interceptors = new ArrayList<>(3); Advice advice = advisor.getAdvice(); // advice本身是否就是MethodInterceptor if (advice instanceof MethodInterceptor) { interceptors.add((MethodInterceptor) advice); } for (AdvisorAdapter adapter : this.adapters) { // 判断advice是哪个advice 如:(advice instanceof MethodBeforeAdvice) if (adapter.supportsAdvice(advice)) { // 将advice封装到对应的interceptor interceptors.add(adapter.getInterceptor(advisor)); } } return interceptors.toArray(new MethodInterceptor[0]); }
若adapter为MethodBeforeAdviceAdapter
,则
public MethodInterceptor getInterceptor(Advisor advisor) { MethodBeforeAdvice advice = (MethodBeforeAdvice) advisor.getAdvice(); return new MethodBeforeAdviceInterceptor(advice); }
其他advice转化过程相同
以上,便将所有的advice转化成了interceptor,接下来,则是经典的链式递归调用过程
以下过程小伙伴们可以对照流程图阅读,毕竟递归还是有些复杂,需要一定的功底
ReflectiveMethodInvocation#proceed
public Object proceed() throws Throwable { // currentInterceptorIndex 初始值为-1 // 当currentInterceptorIndex等于advice的数量减一时,则调用目标方法 // 由于advice已排好序,所以调用顺序为before, after, afterReturn, afterThrowing // 注意,并非调用到相应的advice就会执行advice方法,这里是类似递归调用的方式,会存在一个归过程 // 有些是递的时候发起调用,如beforeAdvice, 但有些则是归的时候发起调用,如afterAdvice // 递归的终止条件则是这下面这个return invokeJoinpoint(); if (this.currentInterceptorIndex == this.interceptorsAndDynamicMethodMatchers.size() - 1) { return invokeJoinpoint(); } // currentInterceptorIndex自增并获取到interceptor Object interceptorOrInterceptionAdvice = this.interceptorsAndDynamicMethodMatchers.get(++this.currentInterceptorIndex); // 将interceptro强转为MethodInterceptor发起调用 return ((MethodInterceptor) interceptorOrInterceptionAdvice).invoke(this); }
此时currentInterceptorIndex值为0,而我们的advice为4个(去除了默认的),所以当currentInterceptorIndex为3时便会调用我们的实际方法
首先调用的是MethodBeforeAdviceInterceptor
public Object invoke(MethodInvocation mi) throws Throwable { // 调用前置通知 this.advice.before(mi.getMethod(), mi.getArguments(), mi.getThis()); return mi.proceed(); }
mi为传入的this,所有mi.proceed()将会回到最开始的方法
再次循环,此时currentInterceptorIndex值为1
调用的是AspectJAfterAdvice
public Object invoke(MethodInvocation mi) throws Throwable { try { return mi.proceed(); } finally { // finally意味着不管怎样都会被调用 invokeAdviceMethod(getJoinPointMatch(), null, null); } }
继续,此时currentInterceptorIndex值为2
调用的是AfterReturningAdviceInterceptor
public Object invoke(MethodInvocation mi) throws Throwable { Object retVal = mi.proceed(); this.advice.afterReturning(retVal, mi.getMethod(), mi.getArguments(), mi.getThis()); return retVal; }
继续,此时currentInterceptorIndex值为3
调用的是AspectJAfterThrowingAdvice
public Object invoke(MethodInvocation mi) throws Throwable { try { return mi.proceed(); } catch (Throwable ex) { if (shouldInvokeOnThrowing(ex)) { // 调用异常通知 invokeAdviceMethod(getJoinPointMatch(), null, ex); } // 往外抛出异常 throw ex; } }
所以如果我们的业务方法发生了异常,会调用到异常通知,而这里又把异常往外抛,所以afterReturn就会被跳过直接到after的finally方法
现在currentInterceptorIndex值为3了,再回调最初的方法中时,就会调用到我们的业务方法了。调用完毕则进行归的过程,调用过程便结束了。
以上,便是整个AOP的过程了,下一篇,事务相关源码解析~
本篇文章中涉及到图片的矢量图地址为:https://www.processon.com/view/link/5fa8afdae401fd45d109f257,有需要的小伙伴可自取