从代码中可以看出,一切都从:AnnotationDrivenBeanDefinitionParser 类的parse开始了

AOP入口,AspectJAutoProxyBeanDefinitionParser,作为核心接口BeanDefinitionParser的一个实现类

一、调用parse,解析beanDefinition

Spring 源码分析03 AOP_动态代理

1.调用registerAspectJAnnotationAutoProxyCreatorIfNecessary

2.对于AOP的实现,基本是靠AnnotationAwareAspectJAutoProxyCreator去完成的,它可以根据@point注解定义的切点来代理相匹配的bean。

Spring 源码分析03 AOP_目标对象_02

3.调用registry.getBeanDefinition,也就是从beanDefinitionMap中获取已经注册好的bean

4.获取注册好的beanDefinition后,调用registerComponentIfNecessary注册这个组件,并且通知监听器

二、上面已经完成了,根据注解,从beanDefinitionMap中获取已经注册的beanDefinition出来,下面就开始创建aop代理 

Spring 源码分析03 AOP_拦截器_03

2.1 继续调用wrapIfNecessary,重点逻辑在getAdvicesAndAdvisorsForBean

     这个方法会提取当前bean 的所有增强方法,然后获取到适合的当前bean 的增强方法,然后对增强方法进行排序,最后返回

2.2 获取到当前bean的增强方法后specificInterceptors

   便调用createProxy方法,创建代理。

2.3 先创建代理工厂proxyFactory,然后获取当前bean 的增强器advisors,把当前获取到的增强器添加到代理工厂proxyFactory。

然后设置当前的代理工的代理目标对象为当前bean,最后根据配置创建JDK的动态代理工厂,或者CGLIB的动态代理工厂,然后返回proxyFactory

2.4 创建aopProxy

Spring 源码分析03 AOP_拦截器_04

三、根据目标类targetClass判断,创建Aop

Spring 源码分析03 AOP_拦截器_05

3.1 如果targetClass是接口,就创建一个JdkDynamicAopProxy

3.2 如果不是接口,就创建一个ObjenesisCglibAopProxy,基于Cglib

3.3 先看下JdkDynamicAopProxy的invoke方法

    3.3.1 如果方法是equals或者hashcode方法,并且目标对象未实现,就直接return

    3.3.2 Advised接口或者其父接口中定义的方法,直接反射调用,不应用通知

    3.3.3 获得目标对象的类,调用targetSource.getTarget();

    3.3.4 获取可以应用到此方法上的拦截器Interceptor列表

Spring 源码分析03 AOP_目标对象_06

 3.3.5 如果拦截器Interceptor列表为空,就直接反射调用 AopUtils.invokeJoinpointUsingReflection。获取结果retVal

    3.3.6  如果拦截器链不为空,那么便创建ReflectiveMethodInvocation类,把拦截器方法都封装在里面,也就是执行

    3.3.7 继续看proceed()方法,

    3.3.8  如果Interceptor执行完了,则执行joinPoint

    3.3.9  如果要动态匹配joinPoint,需要检查运行时参数是否满足匹配条件。匹配成功,就执行当前的Interceptor

      调用 return dm.interceptor.invoke(this);

四、生成代理的内部实现,调用proxy.newProxyInstance 

Spring 源码分析03 AOP_动态代理_07

Spring 源码分析03 AOP_拦截器_08

调用代理对象的构造方法,生成代理类的实例

Spring 源码分析03 AOP_目标对象_09

4.1 深入生成proxy class的细节,遍历目标类所实现的接口,获取目标类实现接口的名称列表

4.2 通过Class.forName(),加载目标类实现的接口到内存,也就是interfaceClass

Spring 源码分析03 AOP_拦截器_10

4.3 Spring 源码分析03 AOP_拦截器_11

4.4 生成代理类的字节码,细节如下

Spring 源码分析03 AOP_拦截器_12

4.5 遍历每一个接口的每一个方法,生成对应的proxyMethod对象

4.6 组装要生成class文件的所有字段信息和方法信息

4.7 写入最终的class文件,如下

Spring 源码分析03 AOP_目标对象_13

Spring 源码分析03 AOP_目标对象_14

Spring 源码分析03 AOP_目标对象_15


+++++++++++++++++++++++++++++++++++++++++++++