目录
2解析advisor: 实例化之前,哪些bean要创建Aop
3创建: 解析切面匹配Bean创建动态代理AbstractAutoProxyCreator
1开启Aop:注入Bean后置处理器
@EnableAspectJAutoProxy-->@Import(AspectJAutoProxyRegistrar.class) -->注册AnnotationAwareAspectJAutoProxyCreator extends AbstractAutoProxyCreator(后面用于创建AOP)
SmartInstantiationAwareBeanPostProcessor(循环依赖下创建aop) extends InstantiationAwareBeanPostProcessor(解析切面) extends BeanPostProcess
spring通过@EnableAspectJAutoProxy开启aop切面,在注解类上面发现@Import(AspectJAutoProxyRegistrar.class),AspectJAutoProxyRegistrar实现了ImportBeanDefinitionRegistrar,所以他会通过registerBeanDefinitions方法为我们容器导入 beanDefinition。
进入解析切面的过程:
postProcessBeforeInstantiation是在任意bean创建的时候就调用了
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#resolveBeforeInstantiation
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsBeforeInstantiation
org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation
org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#postProcessBeforeInstantiation
2解析advisor: 实例化之前,哪些bean要创建Aop
AbstractAutoProxyCreator.postProcessBeforeInstantiation 这是Bean的9大后置处理器,在Bean实例化之前调用
AbstractAutoProxyCreator.postProcessBeforeInstantiation 这是Bean的9大后置处理器,在Bean实例化之前调用
Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName)(InstantiationAwareBeanPostProcessor)
org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#postProcessBeforeInstantiation
org.springframework.aop.aspectj.autoproxy.AspectJAwareAdvisorAutoProxyCreator#shouldSkip
org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator#findCandidateAdvisors
org.springframework.aop.aspectj.annotation.BeanFactoryAspectJAdvisorsBuilder#buildAspectJAdvisors
advisorsCache<beanName,List<Advisor>>全部放到map缓存,每个Bean要生成的几个advisor
BeanFactoryAspectJAdvisorsBuilder advisorsCache<beanName,List<Advisor>>全部放到map缓存,每个Bean要生成的几个advisor
3创建: 解析切面匹配Bean创建动态代理AbstractAutoProxyCreator
AbstractAutowireCapableBeanFactory.createBean-->doCreateBean-->initializeBean
- AbstractAutoProxyCreator.postProcessAfterInitialization是否targetSourcedBeans/是否需要忽略/是否aop基建类Advice,Pointcut,Advisor/是否需要跳过
-->shouldSkip()是不是标记@Aspectj
- -->每个通知生成一个advisor= PointCut切点(初筛+精筛)+advise通知
- -->BeanFactoryAspectJAdvisorsBuilder.advisorsCache中ProxyTargetClass就会用cglib动态代理/没有设置并且有接口就用jdk动态代理
AbstractAutoProxyCreator.postProcessAfterInitialization
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#initializeBean(String, Object, RootBeanDefinition)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsAfterInitialization
org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization
org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#postProcessAfterInitialization
Object postProcessAfterInitialization(@Nullable Object bean, String beanName)(BeanPostProcessor)
org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#postProcessAfterInitialization
org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#wrapIfNecessary
org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator#getAdvicesAndAdvisorsForBean
org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator#findCandidateAdvisors
org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator#findAdvisorsThatCanApply
上述代码的链路最终到了findCandidateAdvisors,我们发现在postProcessBeforeInstantiation方法中对查找到的Advisors做了缓存,
1.获取advisors:创建代理之前首先要判断当前bean是否满足被代理, 所以需要将advisor从之前的缓存中拿出来和当前bean 根据表达式进行匹配,最后创建代理类,并将Advisors赋予代理类,缓存当前的代理类
2.匹配:根据advisors和当前的bean根据切点表达式进行匹配,看是否符合
3.创建代理:找到了和当前Bean匹配的advisor说明满足创建动态代理的条件:
ProxyFactory.getProxy创建代理类 AopProxyFactory.getProxy DefaultAopProxyFactory.createAopProxy->new JdkDynamicAopProxy()/cglib动态代理
4调用:Aop代理调用
- JdkDynamicAopProxy.invoke 里面把每个切面包装成
- JdkDynamicAopProxy.invoke 里面把每个切面包装成
拿取所有的切面chain,每个切面生成一个MethodInterceptor方法(AspectAroundAdvice,AspectAfterAdvice,AfterReturningAdviceInterceptor,AspectAfterThrowingAdvice)
List<Object> chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass);
- 调用每个切面before,after,afterReturn,around
MethodInvocation invocation = new ReflectiveMethodInvocation(proxy, target, method, args, targetClass, chain);
retVal = invocation.proceed();
- chain调用完以后
AopUtils.invokeJoinpointUsingReflection 反射调用目标方法
如果能够解决您的问题,那是再好不过(✿◠‿◠) 。如果没有顺利的解决你的问题,那么请将您的问题留言给我~~~~~~~
再次感谢您能够浏览到这里,如有遗漏或错误,敬请斧正