spring aop最主要的是围绕解析切面类,创建代理对象,调用代理对象方法这三个环节展开,
而解析切面类,创建代理对象得从@EnableAspectjAutoProxy注解说起
这个注解里面@Import了AspectJAutoProxyRegister
在解析配置类的后置处理器中就会对Import注解进行解析,
因为这个类实现了ImportBeanDefinitionRegister接口
所以解析这个类主要就是调用RegisterBeanDefinitions, 向BeanDefinitonMap中注册了
AnnotationAwareAspectJAutoProxyCreator,
而这个Creator是个后置处理器,会在bean实例化前,初始化后两个关键节点上完成解析切面类,创建Proxy代理对象的操作,
解析切面类就是在bean的实例化前循环遍历所有的beanDefinition定义,找出有Aspectj注解的beanDefinition,
把对应的beanName放进一个list中专门记录切面类的bean名称,
遍历对应bean的所有方法,对每一个pointcut注解生成对应的advisor,add进list中
再把key为切面类的beanName,value为对应的上面解析完的该类中的advisor集合put进map中
最后再循环遍历所有的切面类的名称,把map中对应的advisor集合全部add进一个list中
创建Proxy代理对象,在初始化bean对象之后调用后置处理器的对应方法,也就是上文的Creator的对应方法,
循环遍历所有的advisor,匹配当前类的方法是否和advisor中的pointcut的表达式,如果匹配,则将匹配的advisor放进新的list中,当循环完所有advisor,如果新的list中不为空,则代表有advisor匹配,把存放匹配的advisor的list设置进对应的代理工厂,并创建代理对象
最后是调用,取出代理对象对应的advisors,转化成intersector数组责任链
通过遍历责任链数组,递归调用完成advisor中的advice的调用