Spring Boot 缓存功能不需要 spring-boot-starter-cache

2023-11-30

当您尝试使用 Spring Boot 缓存功能时@Cacheable, 你不需要启动模块spring-boot-starter-cache这在 Spring Initializr 中被称为“Spring Cache Abstraction”。

// very basic gradle project setup on spring initializr, with zero dependencies
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
public record Student(String name, int age) {
}

@Repository
public class StudentRepo {

    @Cacheable("cache")
    public Student get() {
        System.out.println("No cache");
        return new Student("Fred", 18);
    }

}

// in any spring component
@EventListener(ApplicationReadyEvent.class)
public void init() {
    System.out.println(repo.get());
    System.out.println(repo.get());
    System.out.println(repo.get());
    System.out.println(repo.get());
    System.out.println(repo.get());
}

这就是结果。

No cache
Student[name=Fred, age=18]
Student[name=Fred, age=18]
Student[name=Fred, age=18]
Student[name=Fred, age=18]
Student[name=Fred, age=18]

显然缓存起作用了。根据文档,它可能是并发哈希图。

我明白了这是怎么可能的。根据maven存储库中的依赖关系,spring-boot-starter-cache给你:

org.springframework » spring-context-support
org.springframework.boot » spring-boot-starter

我们已经有spring-boot-starter,所以深入研究spring-context-support,

org.springframework » spring-beans
org.springframework » spring-context
org.springframework » spring-core

嗯,他们看起来很熟悉。因为这些正是spring-boot-starter已经有了。

基本上,入门模块是传递依赖项。但即便如此,我还是看不出什么spring-boot-starter-cache正是用于激活缓存功能,因为它仅适用于spring-boot-starter anyway.

现在我想知道的是:为什么我应该添加spring-boot-starter-cache?


它“有效”,但仅适用于无缓存或使用地图。唯一可用的支持spring-context依赖性是NoOpCacheManagerSimpleCacheManager (using Map).

它不适用于适当的缓存,例如EhCache, Caffeine等等,因为对这些实现的支持是spring-context-support。对于事务感知缓存也是如此,这也是spring-context-support.

因此它“有效”,但实际上并非如此,因为它不是正在使用的完整且正确的缓存实现。

当然,现在可能还有其他因素在起作用spring-context-support其使用(如使用 java-mail,或使用 Quartz 进行调度)使其可用。

Spring Boot 参考指南中也提到了这一点缓存部分.

Use the spring-boot-starter-cache“Starter”可快速添加基本的缓存依赖项。启动器引入spring-context-support。如果手动添加依赖项,则必须包含spring-context-support为了使用 JCache、EhCache 2.x 或 Caffeine 支持。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Boot 缓存功能不需要 spring-boot-starter-cache 的相关文章

随机推荐

  • lstat:无法访问另一个目录中的文件

    我正在尝试编写类似 ls 的程序 产生类似的输出ls l包含文件的权限 所有者 时间和名称 如果我通过的话效果很好 或什么都没有 所以它适用于当前目录 但是如果我将任何其他目录传入或传出当前目录 perror说它 无法访问 文件 请帮我找出
  • 使用 XAMPP 启用 SSL

    我一直在尽可能地遵循本指南http robsnotebook com xampp ssl encrypt passwords 然而 每当我浏览到以 https 开头的页面时 apache 服务器都会回复 404 未找到对象 我缺少什么设置
  • Python 3.2:cx_freeze 编译我的程序,但处于调试模式

    我正在使用 Python 3 2 和 Pygame 制作游戏 我已经成功地使用了cx freeze将所有内容捆绑到可执行文件中 然后运行 美好的 唯一的问题是 即使当我通过 OO标记我的setup py 我的游戏是在调试模式下编译的 我已经
  • NHibernate / MySQL 字符串连接

    我有一个 nhibernate linq 查询 如下所示 from b in session Query
  • 如何以编程方式在 Active Directory 中搜索打印机

    尝试使用 C 在 Active Directory 中查找打印机 共享 这是我适用于用户的示例代码 但是我看不到能够找到使用相同概念的打印机 我是 Active Directory 新手 DirectoryEntry entry new D
  • httprouter配置NotFound

    我在用着httprouter对于 API 我正在尝试找出如何处理 404 它确实说在docs404 可以手动处理 但我真的不知道如何编写自己的自定义处理程序 在我的其他路线之后我尝试了以下方法 router NotFound pageNot
  • 在混合 MVC/WebForms Web 应用程序中配置授权

    我目前正在将 WebForms MVP 应用程序的一些组件迁移到 MVC 中 到目前为止 除了授权之外 一切正常 无论如何 当我导航到 MVC 版本的登录页面时 我会被重定向到在Web config
  • Maven 需要为托管依赖项指定插件版本 spring-boot-configuration-processor

    我有一个带有模块的 Maven 项目 我的根项目的父项目是spring boot starter parent 它提供了大量的依赖管理 在我的模块中 我使用spring boot configuration processor 这是由管理的
  • 如何在 JavaScript 中扩展 XMLHttpRequest 对象?

    我想扩展现有的XMLHttpRequest对象 以便它可以与所有浏览器一起使用 现在我已经经历了JS继承然而在开始之前我想看看很好的例子 HTML5 有上传和进度事件的东西 我想在继承的新对象中实现这些东西 即使不支持该功能 也可以通过不向
  • 创建 Java 数组时使用尖括号和方括号方法的区别

    我最近刚刚开始使用 Java 并开始接触数组 据我所知 有两种创建数组的方法 对于有 python 背景的我来说 第一种方法最有意义 type ArrayName i e int agesOfParticipants 然而 许多在线资源使用
  • 保护 PhoneGap 中的敏感信息?

    我有许多想要保护的 REST API 密钥 Google Places 等 阅读 Google Groups 等 似乎混淆不是解决方案 使用钥匙串也不是解决方案 那么当 IPA 包可以解压和读取时 您建议如何加密 保护敏感信息 我不想用 O
  • android-gradle-plugin 1.2.2:标记ignoreFailures导致任务connectedAndroidTest出错

    我更新了我的 build gradle 以使用 android gradle 插件 1 2 2 而不是 1 1 0 dependencies classpath com android tools build gradle 1 2 2 之后
  • 不从 Function App 向 Application Insights 发送数据

    我有 Function App 和 Application Insight 服务 我注意到我的应用程序发送的数据量很大并且产生很大的成本 我可以禁用 完全停止向 AI 发送数据而不删除APPINSIGHTS INSTRUMENTATIONK
  • 使用 javascript / jQuery 更好地实现淡入淡出图像交换

    这不是一个具体的问题或错误 而是一个实施问题 首先我想说 我已经看过很多褪色图像教程 并且对不同类型有基本的了解 我希望这个问题不会与其他数百个有关图像褪色的问题一起被抛弃 这基本上就是我想要的 使用 javascript 最好是 jQue
  • 创建对象:有或没有“new”[重复]

    这个问题在这里已经有答案了 可能的重复 使用 new 实例化对象与不使用 new 实例化对象有什么区别 这可能是一个基本问题 并且可能已经被问过 例如 here 但我还是不明白 那么 让我问一下 考虑以下 C 类 class Obj cha
  • 如何让进度条循环并处于确定模式? [复制]

    这个问题在这里已经有答案了 我必须在设备上下载一些图像和视频 并且我喜欢通过在确定模式下覆盖一个圆形进度条来跟踪进度 问题是 无论如何 ProgressBar 仍然是不确定的 有没有办法让它循环并处于确定模式 Layout
  • 如何确保 Excel 计算在 VBA 过程中完成

    在 Excel 电子表格中 用户定义的函数用于计算电子表格矩阵 复合元素的横截面值 的基本结果 Public Function XSValues inputRange as Range as variant returns an array
  • 如何将字符串公式传递给R的lm并在摘要中查看公式?

    在下面的 R 会话中 summary model 显示公式为model str 我如何让它显示为mpg cyl hp同时仍然能够通过字符串设置模型公式 gt data mtcars gt names mtcars 1 mpg cyl dis
  • Android 中可拖放列表项的 ExpandableListView

    我正在寻找在Android中具有ListItems拖放功能的ExpandableListView 或者有什么好的教程或示例 我在哪里可以学习实现ExpanadableListView的拖放功能 我发现了一些关于实现 ListView 拖放的
  • Spring Boot 缓存功能不需要 spring-boot-starter-cache

    当您尝试使用 Spring Boot 缓存功能时 Cacheable 你不需要启动模块spring boot starter cache这在 Spring Initializr 中被称为 Spring Cache Abstraction v