首页 > 社交 > 科普中国

Spring

常驻编辑 科普中国 2022-05-29 切面   切入点   注解   线程   实战   源码   原理   过程   类型   方式   通知   方法

前言:qHb拜客生活常识网

最近因为全链路压测项目需要对用户自定义线程池 Bean 进行适配工作,我们知道全链路压测的核心思想是对流量压测进行标记,因此我们需要给压测的流量请求进行打标,并在链路中进行传递,那么问题来了,如果项目中使用了多线程处理业务,就会造成父子线程间无法传递压测打标数据,不过可以利用阿里开源的 ttl 解决这个问题。qHb拜客生活常识网

全链路压测项目的宗旨就是不让用户感知这个项目的存在,因此我们不可能让用户去对其线程池进行改造的,我们需要主动去适配用户自定义的线程池。qHb拜客生活常识网

在适配过程的过程中无非就是将线程池替换成 ttl 去解决,可通过代理或者替换 Bean 的方式实现,这方面不是本文的内容,本文主要是深入 Spring 异步实现的原理,让大家对 Spring 异步编程不再陌生!qHb拜客生活常识网

正文:qHb拜客生活常识网

运行原理分析

过一遍源码分析,才能知道其中的一些细节原理,这也是不可避免的过程,虽然我也不想在文章中贴过多的源码,但如果不从源码中得出原因,很可能你会知其然不知其所以然。下面就尽量跟着源码走一遍它的运行机制是怎么样的,我把我自己的理解也会尽量详细地描述出来,在这里我会将其关联的源码贴出来分析,这些源码都有其相互关联性,可能你看到后面还会回来再看一遍。qHb拜客生活常识网

注册通知器过程

开启 Spring 异步编程之需要一个注解即可:qHb拜客生活常识网

@EnableAsync

Springboot 中有非常多 @Enable* 的注解,其目的是显式开启某一个功能特性,这也是一个非常典型的编程模型。qHb拜客生活常识网

@EnableAsync 注解注入了一个 AsyncConfigurationSelector 类,这个类目的就是为了注入 ProxyAsyncConfiguration 自动配置类,它的父类 AbstractAsyncConfiguration 做了件事情:qHb拜客生活常识网

org.springframework.scheduling.annotation.AbstractAsyncConfiguration#setConfigurersqHb拜客生活常识网

qHb拜客生活常识网

我们可以实现 AsyncConfigurer 接口的方式去自定义一个线程池 Bean,这个后面会会讲到,源码所示,这里目的是为了这个 bean,并将其定义的线程池对象和异常处理对象保存到 AsyncConfiguration 中,用于创建 AsyncAnnotationBeanPostProcessor 。qHb拜客生活常识网

qHb拜客生活常识网

这两个对象后面源码分析会再次遇上。qHb拜客生活常识网

而这个配置类就是为了注册一个名为 AsyncAnnotationBeanPostProcessor 的 bean,如其名,它是一个 BeanPostProcessor 处理器,它的类继承结构如下所示:qHb拜客生活常识网

qHb拜客生活常识网

从类继承结构可以看出,AsyncAnnotationBeanPostProcessor 实现了 BeanPostProcessor 和 BeanFactoryAware,因此 AsyncAnnotationBeanPostProcessor 会在 setBeanFactory 方法中做了 Spring 异步编程中最为重要的一步,创建一个针对 @Async 注解的通知器 AsyncAnnotationAdvisor(叫做切面貌似也可以),这个通知器主要用于拦截被 @Async 注解的方法。同时,bean 实例初始化过程会被 AsyncAnnotationBeanPostProcessor 拦截处理,处理过程会将符合条件的 bean 注册 AsyncAnnotationAdvisor :

相关阅读:

  • “想了两个月,馋了两个月”…上海人最爱的切面、馄饨皮
  • 面食大全114
  • 当你走投无路的时候,千万不要放弃,这恰恰是你绝处逢生的
  • 校长带发霉面包看望学生?先别急着指责校长
  • 手撕白菜/包菜
  • 过年吃饺子,十几年都是这个馅,3样食材搭配,鲜美,全家喜爱
  • 吃了半辈子疙瘩汤,这做法真是头一次见,味道鲜美,全家爱喝
  • 冬天发面时,记住别直接和面,把经验都告诉你,发面就是这么
  • 面包机可以代替厨师机揉面么?哪个揉面更好?
  • 今年夏天最爱的心机身体乳,涂完全身马上白2个度
    • 网站地图 |
    • 声明:登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。文章内容仅供参考,不做权威认证,如若验证其真实性,请咨询相关权威专业人士。