Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 编写自定义Spring@Cacheable注释_Java_Spring_Caching - Fatal编程技术网

Java 编写自定义Spring@Cacheable注释

Java 编写自定义Spring@Cacheable注释,java,spring,caching,Java,Spring,Caching,我目前正在编写一个自定义的@Cacheable注释,除了Spring的@Cacheable提供的元数据属性外,它还将包含其他元数据属性。然而,Spring需要知道如何解析这个新注释。我的理解是,我需要扩展和覆盖AnnotationCacheOperationsSource的determineCacheOperations(),以便可以使用相应的CacheAbleOperations类初始化新注释。这是正确的方法吗 问候, 史蒂夫要看情况而定 根据, 此类读取Spring的可缓存、CachePut

我目前正在编写一个自定义的@Cacheable注释,除了Spring的@Cacheable提供的元数据属性外,它还将包含其他元数据属性。然而,Spring需要知道如何解析这个新注释。我的理解是,我需要扩展和覆盖AnnotationCacheOperationsSourcedetermineCacheOperations(),以便可以使用相应的CacheAbleOperations类初始化新注释。这是正确的方法吗

问候,

史蒂夫要看情况而定

根据,

此类读取Spring的可缓存、CachePut和CacheExit 注释并将相应的缓存操作定义公开给 Spring的缓存基础设施。此类也可以用作基类 对于自定义CacheOperationSource

因此,如果您要求回答是/否,如果您可以扩展该类以实现CacheOperationSource的扩展行为,那么答案是肯定的

但是,determineCacheOperations()方法使用的是所有可用的CacheAnnotationParser。唯一默认的CacheAnnotationParser是。如果您有一个自定义类,只需让另一个类为您的注释实现CacheAnnotationParser。然后,Spring应该自动使用它。您可以查看SpringCacheAnnotationParser,了解它们是如何实现的


编辑:好吧,我错了,这会自动发生。我的下一个建议是

  • 实现接口CacheAnnotationParser,就像您已经做的那样
  • 扩展AnnotationCacheOperationSource,以便在内部解析器集合中除了Spring之外,还可以放置自己的CacheAnnotationParser
  • 定义自定义AnnotationCacheOperationSource以使用与Spring one相同的id,因此它将覆盖Spring internal。如果id匹配,它应该完全覆盖SpringOne。这将类似于:


非常感谢您的回复。我已经考虑过将SpringCacheAnnotationParser的parseCacheableAnnotation()方法复制到新的扩展AnnotationCacheOperationSource中,但是通过将其抽象到一个单独的CacheAnnotationParser中,您的方法更干净、更合适。我不需要向Spring注册新的CacheAnnotationParser,以便识别它吗?我该怎么做呢?@Steve Spring的工作方式通常是实现所需的接口,然后在Spring上下文中将实现它的类连接为bean。然后根据界面自动正确使用它。我认为这也适用于这种情况。我无法识别新的CacheAnnotationParser。我在配置中使用cache:annotation驱动,在初始化期间,AnnotationDrivenCacheBeanDefinitionParser创建一个AnnotationCacheOperationSource,它使用单个SpringCacheAnnotationParser。我认为一个解决方案是在我的配置中定义一个AnnotationCacheOperationSource、CacheInterceptor和BeanFactoryCacheOperationSourceAdvisor(cacheAdvisor),这将初始化新的pasrer。但我们现在有2个AnnotationCacheOperationSourcebean创建;一个是Spring,一个是我的应用程序。非常感谢您的帮助。@Steve,顺便说一句,您使用的是哪个spring版本?@Steve现在用另一个更新了我的答案suggestion@Steve,你的问题是否已经解决,如果可以,请分享。我也被这个问题所阻碍。谢谢你在这方面的帮助