通过注释

时间:2016-08-19 23:28:22

标签: spring spring-cache ignite

所以,

我试图将现有的缓存(ehcache)转换为点亮缓存,然后迁移到spring注释。我遇到了一些困难,使得注释与我们现有的缓存一样工作 - 我们现有的缓存是在我们缓存新类的某些东西时自动创建的,并且新缓存与对象的名称相同['上课。

所有当前缓存逻辑(以及大多数普通CRUD操作逻辑)都在一个抽象类中,该类为所有持久对象进行了扩展。然而,在研究spring注释时,似乎我需要在方法上定义缓存名称 - 这显然不适用于抽象类,除非我希望所有对象都在同一个缓存中(可能但是绝对不理想)。理想情况下,我将缓存名称指定为" #this.class.toString",但在缓存名称中不允许使用SPEL,就像它在密钥中一样。

似乎动态解决缓存的唯一方法是创建自己的缓存解析器,但由于某种原因,IgniteCache不会扩展springframework Cache,但javax Cache和缓存解析器必须返回前者。所以我甚至都不清楚Ignite缓存如何与spring注释一起工作?

这对我来说似乎是一个非常简单的用例,所以看起来很奇怪春天注释迫使我在方法上提供一个明确的名称,当我假设大多数任何有效大小的应用程序都在抽象它们的持久性方法时,我觉得我一定错过了一些重要的文档,但我肯定无法找到它。有没有办法在具体实现上指定缓存的名称,但是在抽象方法上保留缓存注释?

谢谢!

1 个答案:

答案 0 :(得分:1)

你的问题非常密集,你要做的事情并不是很清楚。什么是“你现有的缓存”一开始?您需要一些方法来标记您实际缓存内容的位置。我假设你已经明白你需要在那里放一个缓存注释。

至于自动创建缓存,我不会切换到尝试实现它的不同缓存系统。尝试首先使用现有缓存基础结构迁移到缓存注释,然后迁移到点燃。

让我们假装你们两个都做。您是对的CacheResolver是可行的方式,它可以适应常规org.springframework.cache.Cachejavax.cache.Cache。一旦你有一个有效的设置,我会做以下事情:

  • CacheResolver实施中,注入已配置的缓存管理器
  • 根据方法调用,找出要使用的缓存名称(获取方法的返回类型,提取FQN)
  • 检查缓存管理器是否具有此类缓存。如果是,请返回。如果它没有创建新缓存并添加它然后返回

如果您使用JCacheCacheManager,则可以调用addCache创建新缓存,然后将结果包装在JCacheCache中,以符合CacheResolver的签名。

最后注意:基于FQN自动创建缓存对我来说似乎有点脆弱,特别是如果你有子类。您需要对您创建的缓存以及应用它们的设置(到期,大小等)进行一些控制。