本文最后更新于:2024年4月22日 下午
本章节探究AOP的使用及其原理剖析,了解AOP的详细使用及其注意事项,探究AOP是怎样在整个Bean生命周期干预来实现的
AOP演示
由于这里源码编译环境采用aspectJ相关,演示测试环境有点麻烦,我们这里采用springboot 新建项目引入AOP,使用SpringTest来进行演示及Debug
1、引入依赖
2、编写测试
执行结果:
环绕方法执行前通知()==> –》 method name sayHello args [123]
前置通知==>sayHello….【args: [123]】
Hello 123
后置通知(不发生异常执行)()==>sayHello….【args: [123]】【result: 123】
后置通知(必定执行)()==>sayHello….【args: [123]】
环绕方法执行后通知()==> –》 method name sayHello args [123]
总结
正常:前置=>目标方法(环绕通知)=>返回通知=>后置通知
异常:前置=>目标方法(环绕通知)=>异常通知=>后置通知
原理剖析
1、了解AOP为生命周期条件,断点在bean12步骤里面为容器添加了什么组件,使用debug来剖析
2、AOP实现是 @EnableAspectJAutoProxy 启用AOP功能
AOP定义阶段
给容器中利用AspectJAutoProxyRegistrar(实现了ImportBeanDefinitionRegistrar)
这个给容器中导入了 AnnotationAwareAspectJAutoProxyCreator 组件
AnnotationAwareAspectJAutoProxyCreator 本质上是一个BeanPostProcessor。
容器刷新第五步 invokeBeanFactoryPostProcessors(beanFactory); 的时候会将AnnotationAwareAspectJAutoProxyCreator注册到容器中去,这里面 ReflectiveAspectJAdvisorFactory (创建增强器的工厂) 和 BeanFactoryAspectJAdvisorsBuilderAdapter(增强器适配器建造者)把这些工具准备好。
后续在正常创建其他对象的时候干预,判断是切面相关 执行BeanPostProcessor 里面的逻辑来增强
在创建其他Bean的时候(第一次),回去遍历所有类来构建增强器 aspectJAdvisorsBuilder.buildAspectJAdvisors()
构建增强器的过程
ps: 案例中这个时候会创建 LogAspect 相关的生成增强器
aspectJAdvisorsBuilder.buildAspectJAdvisors()
构建好了会放在advisorsCache 缓存中去
得到增强器 this.advisorFactory.getAdvisors(factory);
干扰切入点生成代理对象
ps:干扰需要切入的对象的HelloService创建过程,会生成相关代理对象,并转为拦截器链,以便于后续执行过程
容器刷新12大步之 finishBeanFactoryInitialization(beanFactory);里面 beanFactory.preInstantiateSingletons(); 完成对剩下单实例创建的过程中
创建过程中BeanPostProcessor.postProcessAfterInitialization AOP开始增强,这个过程的时候bean已经生成,初始化的时候进行干预Bean
代码位置AbstractAutoProxyCreator.postProcessAfterInitialization
这里会去找当前bean 的增强器,采用MethodMatcher通过正则表达式匹配切入点和目标类的方法。匹配完拿到目标类的增强器的时候,会执行extendAdvisors 创建一个增强器链,在第0位增加一个ExposeInvocationInterceptor拦截器(方法拦截器),接下来拿到了增强器就为当前目标类创建代理,创建时候判断当前对象是否有接口实现,如果有则使用jdk动态代理创建,如果没有接口实现则采用CGlib来进行创建代理
目标方法的执行
当目标方法执行的时候,如helloService.sayHello。这个时候会来到这个代理类设置的回调(DynamicAdvisedInterceptor)里面执行intercept。执行期间将之前的增强器通过getInterceptorsAndDynamicInterceptionAdvice转化为方法拦截器 执行invoke 的时候,链式调用。
代理对象(HelloService)包含拦截器,拦截器中包含增强器,执行的过程中会执行过滤器链,责任链模式
ExposeInvocationInterceptor 线程共享数据
MethodBeforeAdviceInterceptor 前置通知拦截器
MethodBeforeAdvice后置通知拦截器
AfterReturningAdviceInterceptor返回通知拦截器
AspectJAfterThrowingAdvice异常通知拦截器
拦截器链执行细节就不展开了