aop 先标记你要不要代理,然后bean初始化后开始搞事(循环依赖也可能做),把这个增强bean指定的切面东西全部出来了,就是那些注解的方法,然后根据前置 后置 后置返回 环绕通知 取出来他们几个,然后排序
默认 给了一个作为下标0也就是第一个try。下标1是异常通知第二个try,下标2是前置通知但是也是在try里面的还做了取返回值为了给下标3使用同时这个try的finally里面执行后置通知下标3返回通知
-
开启注解
-
@Import AspectJAutoProxyRegistrar 实现了ImportBeanDefinitionRegistrar,会在spring的invokeBeanFactoryPostProcessors中执行ConfigurationClassPostProcessor#postProcessBeanDefinitionRegistry中parser.parse解析注解后,在this.reader.loadBeanDefinitions(configClasses)中执行AspectJAutoProxyRegistrar#registerBeanDefinitions然后注册AnnotationAwareAspectJAutoProxyCreator的后置处理器(用于处理当前应用程序上下文中的所有AspectJ注释方面以及Spring Advisor<包含Pointcut(切入点)和Advice(连接的代码)>)解析出所有的advice并保存
- 在第一次后置处理器标记是否需要aop getBean->doGetBean->createBean->resolveBeforeInstantiation#applyBeanPostProcessorsBeforeInstantiation#postProcessBeforeInstantiation#(AbstractAutoProxyCreator)shouldSkip,判断当前类是否是切面、advice、pointcut、advisor;
- 判断@Aspect是否被解析,如果没有被解析,从容器中拿到所有类型为Object的beanName,遍历所有的beanName解析出被@Aspect标记的类,提取Aspect类中所有的Advice方法,将提取结果加入缓存
- 创建代理 getBean->doGetBean->createBean->doCreateBean->initializeBean->applyBeanPostProcessorsAfterInitialization#postProcessAfterInitialization
- 获取advisors,创建代理之前首先要判断当前bean是否满足被代理, 所以需要将advisor从之前的缓存中拿出来和当前bean 根据表达式进行匹配,在判断该类是否需要做aop时已经存入缓存中,现在从缓存中获取就可以。
- 与当前类匹配根据advisors和当前的bean根据切点表达式进行匹配,看是否符合。getAdvicesAndAdvisorsForBean->findEligibleAdvisors->findAdvisorsThatCanApply->canApply->做粗筛->精筛 还做了一个排序
排序
- 获取advisors,创建代理之前首先要判断当前bean是否满足被代理, 所以需要将advisor从之前的缓存中拿出来和当前bean 根据表达式进行匹配,在判断该类是否需要做aop时已经存入缓存中,现在从缓存中获取就可以。
- 创建代理:找到了 和当前Bean匹配的advisor说明满足创建动态代理的条件
- 代理类调用,是责任链一层套一层的调用