SpringAop过程

目录

1开启Aop:注入Bean后置处理器

2解析advisor: 实例化之前,哪些bean要创建Aop

3创建: 解析切面匹配Bean创建动态代理AbstractAutoProxyCreator

4调用:Aop代理调用


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

  1. AbstractAutoProxyCreator.postProcessAfterInitialization是否targetSourcedBeans/是否需要忽略/是否aop基建类Advice,Pointcut,Advisor/是否需要跳过

-->shouldSkip()是不是标记@Aspectj

  1. -->每个通知生成一个advisor= PointCut切点(初筛+精筛)+advise通知
  2. -->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代理调用

  1. 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 反射调用目标方法

如果能够解决您的问题,那是再好不过(✿◠‿◠) 。如果没有顺利的解决你的问题,那么请将您的问题留言给我~~~~~~~
再次感谢您能够浏览到这里,如有遗漏或错误,敬请斧正
  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值