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