AOP原理
2022-01-03 13:57:59 0 举报
AOP原理详细流程
作者其他创作
大纲/内容
1==2
BeanPostProcessor.postProcessBeforeInitialization()AOP在此没工作,直接返回原生对象
代理对象(HelloService)
invokeJoinpoint();执行连接点【真正执行HelloService.sayHello方法】
invoke(this)
ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsFromRegistrars()加载@Import注解
异常返回链,返回通知被跳过了
CglibMethodInvocation.proceed()
否
advice.before执行前置通知
0==1
单例池中切面类和被代理增强类情况切面类(logAspect):正常的对象。被代理增强类(HelloService):被代理增强的代理对象。
正常通知执行逻辑:前置通知==>目标方法==>返回通知==>后置通知异常通知执行逻辑:前置通知==>目标方法==>异常通知==>后置通知@Around(环绕通知如何实现的呢?)
有增强器的话,则为这个对象创建代理
不需要增强
mi
挨个判断所有的增强器的正则是否能切入这个对象
AfterReturningAdviceInterceptor返回通知拦截器
DefaultAdvisorAdapterRegistry.getInterceptors()增强器转为方法拦截器
接下来继续再创建其他人后置处理器时,因为调用的是getBean,所以必会触发一串增强逻辑
AbstractAutoProxyCreator.wrapIfNecessary()
返回链
属性赋值
return mi.proceed()继续往下
registerBeanPostProcessors(beanFactory);容器刷新12大步之初始化创建所有的BeanPostProcessor
AnnotationAwareAspectJAutoProxyCreator.postProcessAfterInitialization()InstantiationAwareBeanPostProcessor
它是一个BeanPostProcessor(bean的后置处理器:它会干预到每个组件的创建环节)
finishBeanFactoryInitialization(beanFactory);容器刷新12大步之完成工厂初始化
AutowiredAnnotationBeanPostProcessor.postProcessProperties()Autowired赋值结束了
解析到配置类@Import注解
方法前置增强拦截器(MethodBeforeAdviceInterceptor)
1、是否是切面。2、是否跳过。 2.1、获取到所有切面的所有增强器。 2.2、看是否特殊类(Xxx.ORIGINAL)。3、前置的这个过程都没有干什么事。
【这是FilterChain类】CglibMethodInvocation把所有的信息封装到这里helloService的代理、真实对象、增强链、当前方法、使用参数
AnnotationAwareAspectJAutoProxyCreator.postProcessBeforeInstantiation()InstantiationAwareBeanPostProcessor
当前索引已经等于(拦截器总数-1)
1、MethodBeforeAdviceAdapter:方法前置增强器适配器2、AfterReturningAdviceAdapter:方法后置/返回增强器适配器2、ThrowsAdviceAdapter:方法异常增强器适配器
AbstractAutowireCapableBeanFactory.resolveBeforeInstantiation()后置处理器(返回代理阶段)
是否是方法拦截器(MethodInterceptor)
ConfigurationClassParser.doProcessConfigurationClass()解析配置类
CommonAnnotationBeanPostProcessor.postProcessProperties()@Resource赋值结束了
InstantiationAwareBeanPostProcessor.postProcessProperties()
3==4
AOP在创建其它组件环节
AnnotationAwareAspectJAutoProxyCreator.initBeanFactory()准备好了要用的基本对象
增强器集合注意:运行阶段会转为对应的拦截器
MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition()AOP和这个没关系
后置处理器AnnotationAwareAspectJAutoProxyCreator创建好了对象,并且在容器中
别的bean(AnnotationAwareAspectJAutoProxyCreator创建完后的创建的第一个bean)组件创建对象
AOP后置拦截AnnotationAwareAspectJAutoProxyCreator.postProcessBeforeInstantiation()
ExposeInvocationInterceptpr线程共享数据的
.BeanFactoryAspectJAdvisorsBuilder.buildAspectJAdvisors()该后置处理器第一次运行时,会执行该方,就会找到所有的切面,然后缓存起来
增强器适配器是否支持该增强器
MethodInterceptor(cglib家的回调接口)DynamicAdvisedInterceptor
return mi.proceed()继续往下,别管我
整个执行流程https://www.bilibili.com/video/BV1gW411W7wy?p=34
将所有的增强器再转为真正的方法拦截器AdvisedSupport.getInterceptorsAndDynamicInterceptionAdvice()
包含
非异常返回链
ConfigurationClassPostProcessor由配置文件解析器对所有配置类进行解析
运行流程:链式执行
BeanFactoryAspectJAdvisorsBuilder.buildAspectJAdvisors()这里就是从缓存中获取增强器(通知方法)
AspectJAfterAdvice后置通知拦截器
MethodBeforeAdviceInterceptor前置通知拦截器
别的bean(AnnotationAwareAspectJAutoProxyCreator创建完后的创建的第一个bean)创建完了,执行初始化环节InitializeBean
这是拦截器里面的核心方法(invoke)拦截器里面封装了增强器
调用HelloService的方法
1
后置拦截InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation()
是,返回链
继续下一个增强器适配器
AnnotationAwareAspectJAutoProxyCreator.postProcessProperties()AOP介入,但是没做事
getBean(HelloService.class)
org.aopalliance.intercept.MethodInterceptorSpring家的方法拦截接口【这是Filter类】
直接加入拦截器集合
第4、5步的代码,ReflectiveAspectJAdvisorFactory.getAdvisor()
当前类是否是切面类isInfrastructureClass:判断当前类是否有@Aspect注解 或者 类实现了 Advice/Pointcut/Advisor/AopInfrastructureBean接口
AOP定义阶段
遍历所有的增强器for (Advisor advisor : advisors)
-1
A(proxy){B(proxy)}B(proxy){A(proxy)}
HelloService对象创建
最终结果
链式执行
增强器(Advisor)
2==3
获取容器中所有的Object类型的组件,然后挨个判断是否是切面
初始化
AdvisorAdapter.getInterceptor() 由 增强器适配器 将 增强器(保存了哪些方法是通知方法的详细信息) 转为 拦截器(反射执行通知方法的逻辑)
是否发生异常
实验:循环依赖+代理是否会有问题
AnnotationAwareAspectJAutoProxyCreator运行流程总结:第一次运行时,就把切面信息和增强器信息(Advisor缓存起来)都解析好了,提前保存起来
@EnableAspectJAutoProxy
否,返回链
构建增强器(第一次进来,它也不知道切面)BeanFactoryAspectJAdvisorsBuilder.buildAspectJAdvisors()
拦截器(Interceptor)
this.advice.afterReturning()执行返回通知
AspectJAfterThrowingAdvice异常通知拦截器
实现
AbstractAutowireCapableBeanFactory.invokeAwareMethods()组件(bean对象)实现了BeanFactoryAware 接口,则执行对应的回调方法
挨个遍历切面,然后构建增强器(哪些切面有哪些方法合适运行),最后缓存起来。advisorsCache保存了增强器
1、属性里面用ReflectiveAspectJAdvisorFactory(创建增强器的工厂) --- 反射方式的切面增强器工厂2、属性里面还有一个BeanFactoryAspectJAdvisorsBuilderAdapter(增强器的建造者)3、上述两个对象负责保存和产生功能增强器。
增强器转为拦截器的目的:统一每一个增强器的调用入口
ConfigurationClassBeanDefinitionReader.loadBeanDefinitions加载配置类中的bean定义信息
我们的后置处理器创建结束了
4
是
创建代理对象里面保存了很多
return mi.proceed();继续往下
invokeBeanFactoryPostProcessors(beanFactory);容器刷新12大步骤之工厂增强环节
判断当前类是否需要跳过shouldSkip:当前类是否需要增强的Bean
Object retVal = mi.proceed()继续往下拿返回值
注册AnnotationAwareAspectJAutoProxyCreator的bean定义信息
1、增强器:只是保存了信息2、拦截器:能真正的执行目标方法
在其它bean组件(普通bean、后置处理器等)创建时,我们(AnnotationAwareAspectJAutoProxyCreator)就干预了
invoke(this)这里的this就是CglibMethodInvocation执行:使用ThreadLocal保存CglibMethodInvocation
HelloService的代理对象的callback是DynamicAdvisedInterceptor,所以每次调用代理对象的方法时,都会回调DynamicAdvisedInterceptor(MethodInterceptor)
for (AdvisorAdapter adapter : this.adapters)遍历所有的增强器适配器
-1==0
finally{ invokeAdviceMethod;}前面结束了,一定要执行这个方法
1、将所有的增强器再转为真正的方法拦截器AdvisedSupport.getInterceptorsAndDynamicInterceptionAdvice()
getBean创建AnnotationAwareAspectJAutoProxyCreator的对象
BeanPostProcessor.postProcessAfterInitialization()AOP判断此对象,如果有增强方法(有切面切入它)
收藏
收藏
0 条评论
下一页