作为库:如何提供默认的 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",所以可能有一个我不知道的常见解决方案。
我自己提供了 JCache 的实现 API。
+:我的图书馆user/consumer可以轻松开箱即用,无需提供任何东西。
-:如果应该使用自定义的、用户特定的实现,则有必要在 maven 级别上从我的库中排除该实现。
-:执行此操作的多个库之间可能会发生冲突。
我没有提供 JCache 的任何实现 API。
+:与其他库或我的库的使用者想要使用的任何自定义实现没有冲突。
-: 有必要提供一个JCache 实现,即使消费者不知道其中涉及缓存。
这看起来非常像日志记录设置,我在我的应用程序中使用 slf4j-api
并且消费者需要自己提供一个实现。但是对我来说,日志记录比缓存更常见。
实际上,您已经很好地阐述了不同方法的优缺点。所以我选择了你的两种方法并给出了一些额外的提示:
- I provide an implementation of the JCache API myself.
1.1:
您可以使用 maven shade 插件将 JCache API 和实现移动到不同的包。那么你们就没有冲突了。它的缺点是,使用(原始)源代码进行调试时会造成混乱。
1.2:
您可以保留原始 JCache API 并使用实现的阴影版本。可能会与期望一个或 "their" 个默认实现的应用程序发生冲突。您可以通过不使用正常的 SPI 机制进行实例化来避免这种情况。
- I don't provide any implementation the JCache API.
缓存实现在功能和配置方面有很大差异。我建议您至少有一个设置,其中包含适用于 OOTB 的实现和配置。依赖于实现或通过捆绑的阴影实现。
如果您使用 Maven 依赖项,如果用户有不同的偏好或要求,他们可能会排除缓存实现并使用他们自己的实现。
我建议保持简单,从依赖项开始,然后查看用户可能需要什么或出现问题的地方。最好从一开始就把事情复杂化。
假设我写了一个库并想缓存一些长 运行 或脆弱任务的结果。为此,我在我的代码中使用 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",所以可能有一个我不知道的常见解决方案。
我自己提供了 JCache 的实现 API。
+:我的图书馆user/consumer可以轻松开箱即用,无需提供任何东西。
-:如果应该使用自定义的、用户特定的实现,则有必要在 maven 级别上从我的库中排除该实现。
-:执行此操作的多个库之间可能会发生冲突。
我没有提供 JCache 的任何实现 API。
+:与其他库或我的库的使用者想要使用的任何自定义实现没有冲突。
-: 有必要提供一个JCache 实现,即使消费者不知道其中涉及缓存。
这看起来非常像日志记录设置,我在我的应用程序中使用 slf4j-api
并且消费者需要自己提供一个实现。但是对我来说,日志记录比缓存更常见。
实际上,您已经很好地阐述了不同方法的优缺点。所以我选择了你的两种方法并给出了一些额外的提示:
- I provide an implementation of the JCache API myself.
1.1: 您可以使用 maven shade 插件将 JCache API 和实现移动到不同的包。那么你们就没有冲突了。它的缺点是,使用(原始)源代码进行调试时会造成混乱。
1.2: 您可以保留原始 JCache API 并使用实现的阴影版本。可能会与期望一个或 "their" 个默认实现的应用程序发生冲突。您可以通过不使用正常的 SPI 机制进行实例化来避免这种情况。
- I don't provide any implementation the JCache API.
缓存实现在功能和配置方面有很大差异。我建议您至少有一个设置,其中包含适用于 OOTB 的实现和配置。依赖于实现或通过捆绑的阴影实现。
如果您使用 Maven 依赖项,如果用户有不同的偏好或要求,他们可能会排除缓存实现并使用他们自己的实现。
我建议保持简单,从依赖项开始,然后查看用户可能需要什么或出现问题的地方。最好从一开始就把事情复杂化。