前言
异步编程是让程序并发运行的一种手段。它允许多个事情同时发生
,当程序调用需要长时间运行的方法时,它不会阻塞当前的执行流程,程序可以继续运行,当方法执行完成时通知给主线程根据需要获取其执行结果或者失败异常的原因。使用异步编程可以大大提高我们程序的吞吐量,可以更好的面对更高的并发场景并更好的利用现有的系统资源,同时也会一定程度上减少用户的等待时间等。本文我们一起来看看在 Java
语言中使用异步编程有哪些方式。
Fork/Join
框架是一种在 JDK 7
引入的线程池,用于并行执行把一个大任务拆成多个小任务并行执行,最终汇总每个小任务结果得到大任务结果
的特殊任务。通过其命名也很容易看出框架主要分为 Fork
和 Join
两个阶段,第一阶段 Fork
是把一个大任务拆分为多个子任务并行的执行,第二阶段 Join
是合并这些子任务的所有执行结果,最后得到大任务的结果。
这里不难发现其执行主要流程:首先判断一个任务是否足够小,如果任务足够小,则直接计算,否则,就拆分成几个更小的小任务分别计算,这个过程可以反复的拆分成一系列小任务。Fork/Join
框架是一种基于 分治 的算法,通过拆分大任务成多个独立的小任务,然后并行执行这些小任务,最后合并小任务的结果得到大任务的最终结果,通过并行计算以提高效率。
什么是循环依赖
呢?可以把它拆分成循环
和依赖
两个部分来看,循环是指计算机领域中的循环,执行流程形成闭合回路;依赖就是完成这个动作的前提准备条件,和我们平常说的依赖大体上含义一致。放到 Spring
中来看就一个或多个 Bean
实例之间存在直接或间接的依赖关系,构成循环调用,循环依赖可以分为直接循环依赖
和间接循环依赖
,直接循环依赖的简单依赖场景:Bean A
依赖于 Bean B
,然后 Bean B
又反过来依赖于 Bean A
(Bean A -> Bean B -> Bean A
),间接循环依赖的一个依赖场景:Bean A
依赖于 Bean B
,Bean B
依赖于 Bean C
,Bean C
依赖于 Bean A
,中间多了一层,但是最终还是形成循环(Bean A -> Bean B -> Bean C -> Bean A
)。
Feign 是⼀个 HTTP 请求的轻量级客户端框架。通过 接口 + 注解的方式发起 HTTP 请求调用,面向接口编程,而不是像 Java 中通过封装 HTTP 请求报文的方式直接调用。服务消费方拿到服务提供方的接⼝,然后像调⽤本地接⼝⽅法⼀样去调⽤,实际发出的是远程的请求。让我们更加便捷和优雅的去调⽤基于 HTTP 的 API,被⼴泛应⽤在 Spring Cloud 的解决⽅案中。开源项目地址:Feign,官方描述如下:
Feign is a Java to HTTP client binder inspired by Retrofit, JAXRS-2.0, and WebSocket. Feign’s first goal was reducing the complexity of binding Denominator uniformly to HTTP APIs regardless of ReSTfulness.
搜索能力是被绝大多数人低估一项基本素质,绝大部分做编程技术相关的朋友应该都知道如何使用 Google
,但是并不知道如何利用它的潜力。其实不管是 Google
还是 百度
,会搜索的人一样都可以查找到需要的东西,不会搜索的人用什么都不好使。下面介绍一些 Google
常用的搜索技巧以及搜索快捷方式,可以帮助你更快,更准确地找到结果。Google
是世界上功能最强大的搜索引擎,它已经改变了我们查找信息的方式。
前面两篇 如何实现 AOP(上)、如何实现 AOP(中) 做了一些 AOP
的核心基础知识简要介绍,本文进入到了实战环节了,去实现一个基于 XML
配置的简易版 AOP
,虽然是简易版的但是麻雀虽小五脏俱全
,一些核心的功能都会实现,通过实现这个简易版的 AOP
,相信你会对 AOP
有深入的理解,不止知其然,还能知其所以然。AOP
的顶层接口规范和底层依赖基础组件都是由一个叫 AOP Alliance 的组织制定的,我们经常听到的 AspectJ
、ASM
、CGLIB
就是其中被管理的一些项目,需要明确的一点是,在 Spring
中只是使用了 AspectJ
的核心概念和核心类,并不是像 AspectJ
那样在编译期实现的 AOP
,而是在运行期。话不多说,下面开始进入主题。