作为库:如何提供默认的 JCache 实现

As a library: How to provide default JCache implementation

假设我写了一个库并想缓存一些长 运行 或脆弱任务的结果。为此,我在我的代码中使用 JCache API。

所以我的 pom.xml 将包含一个依赖项,例如

<dependency>
    <groupId>javax.cache</groupId>
    <artifactId>cache-api</artifactId>
    <version>1.1.1</version>
    <scope>provided</scope> <!-- does this even make sense? -->
</dependency>

基于此,我现在想知道如何让用户的使用尽可能简单?

我看到的两个选项都不是最优的,我感觉这一定是某种常见的"problem",所以可能有一个我不知道的常见解决方案。

  1. 我自己提供了 JCache 的实现 API。

    +:我的图书馆user/consumer可以轻松开箱即用,无需提供任何东西。

    -:如果应该使用自定义的、用户特定的实现,则有必要在 maven 级别上从我的库中排除该实现。

    -:执行此操作的多个库之间可能会发生冲突。

  2. 我没有提供 JCache 的任何实现 API。

    +:与其他库或我的库的使用者想要使用的任何自定义实现没有冲突。

    -: 有必要提供一个JCache 实现,即使消费者不知道其中涉及缓存。

这看起来非常像日志记录设置,我在我的应用程序中使用 slf4j-api 并且消费者需要自己提供一个实现。但是对我来说,日志记录比缓存更常见。

实际上,您已经很好地阐述了不同方法的优缺点。所以我选择了你的两种方法并给出了一些额外的提示:

  1. I provide an implementation of the JCache API myself.

1.1: 您可以使用 maven shade 插件将 JCache API 和实现移动到不同的包。那么你们就没有冲突了。它的缺点是,使用(原始)源代码进行调试时会造成混乱。

1.2: 您可以保留原始 JCache API 并使用实现的阴影版本。可能会与期望一个或 "their" 个默认实现的应用程序发生冲突。您可以通过不使用正常的 SPI 机制进行实例化来避免这种情况。

  1. I don't provide any implementation the JCache API.

缓存实现在功能和配置方面有很大差异。我建议您至少有一个设置,其中包含适用于 OOTB 的实现和配置。依赖于实现或通过捆绑的阴影实现。

如果您使用 Maven 依赖项,如果用户有不同的偏好或要求,他们可能会排除缓存实现并使用他们自己的实现。

我建议保持简单,从依赖项开始,然后查看用户可能需要什么或出现问题的地方。最好从一开始就把事情复杂化。