springaop
2023-01-23 21:08:37 0 举报
springaop底层流程图
作者其他创作
大纲/内容
不符合
从调用链取出intercept(第一个开始取)
不为空
createAopProxy().getProxy()
this.adapters有三个1.MethodBeforeAdviceAdapter2.AfterReturningAdviceAdapter3.ThrowsAdviceAdapter遍历所有adapters
把Advisor封装成为Interceptor
获取切面类中没有加@Pointcut的方法,获取后进行排序(对方法进行排序,按注解和方法名字进行排序)进行遍历生成AdvisorgetAdvisorMethods(aspectClass)
invoke方法中执行切面逻辑(比如执行方法前逻辑,返回后逻辑等)
若有封装成InstantiationModelAwarePointcutAdvisorImpl(一个advisor,代理对象在执行对应返回时会执行getAdvice中的逻辑)进行返回
缓存没有,遍历ProxyFactory中所有的advisors
已经判断过的bean直接返回
直接调用对应方法
不是
拿到targetSource
InstantiationModelAwarePointcutAdvisorImpl.getAdvice逻辑
直接执行方法,不走下面的代理逻辑
递归
匹配成功
再匹配方法,根据getMethodMatcher.matches匹配方法(两个参数的方法)
为空
把Interceptor放入调用链
AopUtils.canApply targetClass和PointCut进行匹配先getClassFilter匹配类再匹配getMethodMatcher.matches(两个参数)
当调用完了最后一个interceptor后就会执行被代理方法
逐一getBean返回Adivisor
chain为空(没有Advice)
super.findCandidateAdvisors
true
找到所有的Advisor
AnnotationAwareAspectJAutoProxyCreator.findCandidateAdvisors
判断ProxyFactory的exposeProxy为true
是
创建ProxyFacotry,通过proxyFactory.getProxy获取代理对象
匹配参数,根据getMethodMatcher.matches匹配方法(三个参数的方法)
获取方法上面的注解,每个注解对应不同的逻辑,下面以Before注解为例
AbstractAdvisorAutoProxyCreator.findEligibleAdvisors
使用cglib动态代理ObjenesisCglibAopProxy(config)
ReflectiveAspectJAdvisorFactory.getAdvice
返回代理对象
进行筛选Advisor
方法为equal、hashcode方法
拿到当前方法所对应的Pointcut对象,若没有直接返回
1.不是在GraalVM虚拟机上运行2.ProxyFactory的isOptimize为true(Spring认为cglib比jdk动态代理要快)3.isProxyTargetClass为true4.被代理对象没有实现接口(没有通过ProxyFactory.addInterface添加接口)
符合
根据Advisor.class类型获取容器中所有beannames进行遍历
createAopProxy()执行逻辑
false
获取Pointcut,通过getClassFilter方法匹配类
不是直接执行的,代理对象在执行对应返回时会执行
intercept是InterceptorAndDynamicMethodMatcher
aspectJAdvisorsBuilder.buildAspectJAdvisors()
按Ordered接口、@Order注解进行排序后返回
通过AopContext.setCurrentProxy把当前代理对象加入到threadlocal中
不匹配,执行下一个intercept
当前正在创建的Bean不用进行AOP(如Advice、Pointcut、Advisor)
invocation.proceed();
根据Object.class类型获取容器中所有beannames进行遍历
proxyFactory.getProxy()
getMethodMatcher.isRuntime(动态)
调用supportsAdvice判断advice是否属于当前适配器
proxyFactory.getProxy()代理逻辑(以jdk动态代理举例子)
使用jdk动态代理JdkDynamicAopProxy(config);
1.被代理类是接口或2.被代理类已经被jdk动态代理了
targetSource.getTarget()获取被代理对象
拓展点:proxyFactory.addAdvice方法中会把advice封装成DefaultIntroductionAdvisor加入到advisor中
AbstractAutoProxyCreator.postProcessAfterInitialization
getInterceptor
执行MethodInterceptor.invoke方法
把Interceptor封装成InterceptorAndDynamicMethodMatcher放入调用链
匹配
0 条评论
下一页