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