08. Spring Framework AOP
2022-03-16 20:16:06 0 举报
AI智能生成
Spring AOP
作者其他创作
大纲/内容
@Import(AspectJAutoProxyRegistrar.class)<div>给容器中导入组件 AspectJAutoProxyRegistrar</div>
registerAspectJAnnotationAutoProxyCreatorIfNecessary(registry)<br>判断是否有必要向容器中导入组件
给容器中导入【AnnotationAwareAspectJAutoProxyCreator】组件<div>给它是一个 BeanPostProcessor 组件</div>
AnnotationAwareAspectJAutoProxyCreator<br>AOP 核心功能组件
setBeanFactory()<br><div><span style="font-size: inherit; color: rgb(50, 50, 50); --darkreader-inline-color:#292e31;" data-darkreader-inline-color=""></span></div>因为实现了【BeanFactoryAware】接口,所以会回调这个方法
initBeanFactory()<br>给【aspectJAdvisorFactory】和【aspectJAdvisorsBuilder】属性赋值
postProcessBeforeInstantiation()<br>因为实现了【InstantiationAwareBeanPostProcessor】接口,所以会回调这个方法<br>仅仅是分析一下,不会创建 bean 对象
isInfrastructureClass(beanClass)<br>判断当前类是否是一个切面<br>如果满足就添加到【advisedBeans, false】属性中,表示已经处理过且不需要增强<br>
shouldSkip(beanClass, beanName)<br>判断当前类是不是一个需要增强的 bean<br>如果跳过就添加到【advisedBeans, false】属性中,表示已经处理过且不需要增强<br>
findCandidateAdvisors()<br>获取所有的候选增强器,再一一判断<br>增强器就是哪些切面的哪些方法在何时执行<br>
super.findCandidateAdvisors()<br>先从父类查找增强器,查找不到
aspectJAdvisorsBuilder.buildAspectJAdvisors()<br>构建增强器<br>
从容器中获取所有 bean,挨个判断是否是切面类,然后缓存<br>根据 advisorFactory 创建出【Advisor】增强器,然后缓存
advisorFactory.getAdvisors(factory)<br>根据切面类创建增强器<br>
postProcessAfter<span style="font-size: inherit; color: rgb(50, 50, 50); --darkreader-inline-color:#292e31;" data-darkreader-inline-color="">Initialization()</span><div>因为实现了【InstantiationAwareBeanPostProcessor】接口,所以会回调这个方法<br>在这里返回了 AOP 代理对象</div>
wrapIfNecessary(bean, beanName, cacheKey)<br>判断是否需要对 bean 进行代理
getAdvicesAndAdvisorsForBean()<br>如果有切面的通知方法切入对象,那么就给这个对象创建代理
findEligibleAdvisors()<br>获取有资格的增强器
findAdvisorsThatCanApply()<br>找到可以适用的增强器
findAdvisorsThatCanApply()<br>根据切入点表达式正则判断是否能够切入
sortAdvisors()<br>如果找到了增强器,给增强器排序
extendAdvisors(eligibleAdvisors)<br>给增强器集合的第 0 个索引添加一个拦截器【ExposeInvocationInterceptor】<br>它实现了【MethodInterceptor】接口
createProxy()<br>创建代理对象
proxyFactory.getProxy()<br>获取代理对象
createAopProxy()<br>选择是 JDK 动态代理还是 CGLIB 代理
getProxy()<br>创建代理对象,实际上就是把之前查找到的增强器绑定到目标方法上
CglibAopProxy.intercept()<br>目标方法在执行时会被这个方法拦截<br>因为 CGLIB 在创建代理时,设置的 callback 回调是 DynamicAdvisedInterceptor
getInterceptorsAndDynamicInterceptionAdvice()<br>将增强器处理成拦截器,并组装成一个 List 调用链<br>增强器只是保存了信息,拦截器可以用来执行目标方法
ReflectiveMethodInvocation.proceed()<br>执行代理方法 + 目标方法
ExposeInvocationInterceptor.invoke()<br><div>将 MethodInvocation 保存在 ThreadLocal 中,然后执行 proceed() 方法</div>
MethodBeforeAdviceInterceptor.invoke()<br><div>先调用前置通知,再调用 proceed() 方法</div>
AspectJAfterAdvice.invoke()<br><div>先执行 proceed() 方法,在 finally 执行后置通知</div>
AfterReturningAdviceInterceptor.invoke()<br><div>先调用 proceed() 方法获取结果,拿到结果再执行返回通知</div>
AspectJAfterThrowingAdvice.invoke()<br>先调用 proceed() 方法,在异常里执行异常通知
CglibAopProxy.invokeJoinpoint()<br>调用真正的目标执行方法
0 条评论
下一页