spring AOP 实例创建过程和调用过程
2022-05-19 15:21:32 0 举报
spring AOP 创建以及调用过程
作者其他创作
大纲/内容
this.currentInterceptorIndex == this.interceptorsAndDynamicMethodMatchers.size() - 1
applyBeanPostProcessorsAfterInitialization
beanNamesForTypeIncludingAncestors查找Advisor.class类型的
shouldSkip
createProxy创建代理
第一步
ExposeInvocationInterceptor .invoke(this)
resolveBeforeInstantiation
放到缓存中
getAdvisors获得增强器
InstantiationAwareBeanPostProcessor接口
2==5-1
super.findCandidateAdvisors()
aspectJAnnotation.getAnnotationType()注解类型
getAdvisorMethods获得所有切面的方法,排除切点
为空
1==5-1
AspectJAfterAdvice .invoke(this)
ReflectiveAspectJAdvisorFactory
switch返回各个类型的增强器
获取方法上的拦截器链getInterceptorsAndDynamicInterceptionAdvice,从缓存获取
findCandidateAdvisors
从这一步来看,在实例之前什么都没干,就是初始化了一些东西
return null
getAdvice
findAspectJAnnotationOnMethod查找方法上的注解
因为@EnableAspectJAutoProxy导入了AnnotationAwareAspectJAutoProxyCreator
getBean
实现
有返回
否
this.advice.afterReturning
循环所有的BeanName
invocation.proceed()
是否为基础的代理类isInfrastructureClass
没有直接走doCreateBean
AfterReturningAdviceInterceptor .invoke(this)
findCandidateAdvisors获得增强器
hasInstantiationAwareBeanPostProcessors
invokeJoinpoint调用目标方法
aspectNames是否为空,即是否解析过
doCreateBean
获取定制的增强器
wrapIfNecessary
canApply,主要做方法的匹配
extendAdvisors,添加扩展的执行器,且放在第一位
AbstractAutoProxyCreator
ReflectiveMethodInvocation创建反射调用对象
shouldSkip,此时执行,都走缓存,应为上一步已经执行过一次
advisorRetrievalHelper.findAdvisorBeans()
getAdvisor
beanNamesForTypeIncludingAncestors,获得所有类型的组件
advisors.addAll(classAdvisors)
chain.isEmpty()
cachedAdvisorBeanNames
3==5-1
通过帮助类查找
调用前进行一系列的判断,是否代理
缓存查找
findEligibleAdvisors
AspectJAfterThrowingAdvice .invoke(this)
执行finally,执行后置通知(after)
InstantiationModelAwarePointcutAdvisorImpl创建Advisor实现类
不为空
返回
createBean
doGetBean
根据advised.exposeProxy判读是否需要暴露代理对象
postProcessAfterInitialization
判断如果advisor的切面名称和创建的beanname相等则放回true,否则返回false
getAdvicesAndAdvisorsForBean
0==5-1
catch代码块
return proxy
有
4==5-1
this.aspectJAdvisorsBuilder.buildAspectJAdvisors()
执行before方法
findAdvisorsThatCanApply获得可用的增强器
JdkDynamicAopProxy#invoke
AopUtils.invokeJoinpointUsingReflection通过反射调用
继承
-1==5-1
this.advisorFactory.isAspect(beanType)是否是切面类型
invokeAdviceMethod
postProcessBeforeInstantiation
没有
第二步
1)判断当前类是PointCut Advisor advice AopInfrastructureBean 2)当前类是切面类
initializeBean
获得通知
获取切点表达式
MethodBeforeAdviceInterceptor .invoke(this)
instantiateAdvice实例化切面
查找自定义的切面增强器
aspectInstanceFactory.getAspectMetadata().getAspectClass();获得切面类
异常?
specificInterceptors
IOC 容器中查找增强器,这里为空
0 条评论
回复 删除
下一页