Spring AOP实现原理

入口:META/spring.handlers中配置了aspectj-autoproxy的解析类为AopNamespaceHandler,当在xml配置时,会找到这个handler,并执行init方法

一、前提,注册解析器
1.注册AspectJAutoProxyBeanDefinitionParser解析类
2.扫描Element时,逐级调用注册AspectJAutoProxyBeanDefinitionParser的parse方法->AopNamespaceUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(parserContext, element);
3.2中接口做了三件事 主要是RootBeanDefinition增加AnnotationAwareAspectJAutoProxyCreator类型的bean

二、开始解析 构建advice
1.initializeBean->applyBeanPostProcessorsAfterInitialization->AbstractAutoProxyCreator.postProcessAfterInitialization->wrapIfNecessary(关键方法,如果它适合被代理,则要封装指定bean)
2.※※※ wrapIfNecessary ※※※ -> AbstractAdvisorAutoProxyCreator.getAdvicesAndAdvisorsForBean->findEligibleAdvisors->findEligibleAdvisors->BeanFactoryAspectJAdvisorsBuilder.buildAspectJAdvisors() -> 主要逻辑
1⃣️循环所有的 beanName:BeanFactoryUtils.beanNamesForTypeIncludingAncestors(this.beanFactory, Object.class, true, false) 找出对应的增强方法
2⃣️寻找类上的@Aspect注解 advisorFactory.isAspect(beanType)
3⃣️解析AspectJ注解中的增强方法advisorFactory.getAdvisors(factory)
4⃣循环遍历该类中的所有增强方法 getAdvisorMethods(aspectClass)跳过@Pointcut标记的注解 -> getAdvisor(method, lazySingletonAspectInstanceFactory, advisors.size(), aspectName)->getPointcut(candidateAdviceMethod, aspectInstanceFactory.getAspectMetadata().getAspectClass())->AbstractAspectJAdvisorFactory.findAspectJAnnotationOnMethod(candidateAdviceMethod);->寻找方法上的Before.class, Around.class, After.class, AfterReturning.class, AfterThrowing.class, Pointcut.class注解
5⃣️获取切点表达式,封装成AspectJExpressionPointcut类,再包装成InstantiationModelAwarePointcutAdvisorImpl增强器
6⃣️InstantiationModelAwarePointcutAdvisorImpl构造方法中的instantiateAdvice()根据有切点的方法初始化不同的增强器,如AtBefore对应AspectJMethodBeforeAdvice
7⃣️增强器的实现
1.@before间接 MethodBeforeAdviceInterceptor包装了AspectJMethodBeforeAdvice:before->invokeAdviceMethod()->invokeAdviceMethodWithGivenArgs()->aspectJAdviceMethod.invoke
2.@After直接 AspectJAfterAdvice: invoke->invokeAdviceMethod
8⃣️返回advice

三、怎么调用到invoke方法中去的 调用代理类后是怎么调用对应的增强方法的,为啥是invoke方法?
0.衔接二、wrapIfNecessary,getAdvicesAndAdvisorsForBean()完成以后的到specificInterceptors,调用
Object proxy = createProxy(
bean.getClass(), beanName, specificInterceptors, new SingletonTargetSource(bean));
1.jdk代理 JdkDynamicAopProxy实现了InvocationHandler接口,getProxy方法把this放入,反编译后的文件见https://www.cnblogs.com/gonjan-blog/p/6685611.html
同名方法会改成调用h.invoke方法即JdkDynamicAopProxy.invoke方法
2.构建MethodInvocation
MethodInvocation invocation = new ReflectiveMethodInvocation(proxy, target, method, args, targetClass, chain);
// Proceed to the joinpoint through the interceptor chain.
retVal = invocation.proceed();
3.转成对应的增强器,执行增强器中的方法

主要流程:
DynamicAdvisedInterceptor.intercept()->ReflectiveMethodInvocation.proceed()->MethodInterceptor.invoke()

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值