2016-08-19 41 views
0

所以,创建通过注释从对象类型缓存

我想转换我们现有的缓存(的Ehcache)点燃缓存,并迁移到Spring注解。我遇到了一些困难,使注解与我们现有的缓存一样工作 - 我们现有的缓存是自动创建的,只要我们缓存某个新类的某些内容,并且新缓存与对象的类名称相同。

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

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

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

谢谢!

+0

你使用Spring注释与EhCache?如果是的话,它是如何工作的?如果不是,首先使用它们的原因是什么?为什么不直接使用Ignite API? –

回答

1

你的问题是相当密集的,它不是很清楚你想要做什么。什么是“您现有的缓存”开始?您需要某种方式来标记您实际缓存我想要的东西的地方。我假设你已经理解你需要在那里放置缓存注释。至于自动创建缓存,我不会切换到不同的缓存系统试图实现这一点。尝试首先将您的现有缓存基础结构迁移到缓存注释,然后迁移到点火。

让我们假装你还是这样做。你是对的CacheResolver是要走的路,它可以适应规则org.springframework.cache.Cachejavax.cache.Cache。一旦你有一个可行的设置,我会做到以下几点:

  • 在你CacheResolver实施,注入已配置
  • 基于方法调用缓存管理器,找出缓存名称使用(获取方法的返回类型,提取FQN)
  • 检查缓存管理器是否有这样的缓存。如果有,请返回。如果不创建一个新的缓存,并添加它,然后返回

如果您使用JCacheCacheManager,你可以调用addCache创建一个新的缓存,然后包裹结果JCacheCache遵守签名的CacheResolver

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