Spring 中 @Cacheable 注释的编程替代方案

Programmatic alternative to @Cacheable annotation in Spring

最近我一直在涉足架构,我有一个用例,其中经常使用相同的参数调用来自我的域的非常昂贵的计算(在你得出任何结论之前,我没有确定参数,而这些完全由外部调用者提供)。我想保持我的应用程序架构尽可能干净,并且不想在我的域层中添加对 Spring 的依赖,但我仍然想使用 Spring 缓存功能。

我知道 Spring 提供了 @Cacheable 注释,但如前所述,我不想在我的 类 上使用它们以避免添加对 Spring 的依赖.

是否可以这样做:


@Configuration
public MyConfigurationClass {

    @Bean
    public DomainClass createDomainClassBean() {
        DomainClass domainInstance = new DomainClass(...);
        // Programatically add @Cacheable annotation to the domain class.
        ...
    }

}

是否可以在不依赖注释的情况下以编程方式为方法启用 @Cacheable 行为?

编辑:我对不依赖 Spring 功能的替代方案持开放态度,但我更愿意避免向域层添加依赖项。

看看 Spring 的 CacheProxyFactoryBean class。

在内部,Spring 的 Cache Abstraction and caching infrastructure applied to Spring application service classes, your application domain classes, (whether using Declarative, Annotation-based Caching configuration and demarcation, or Declarative, XML-based Caching configuration, etc) is all backed by Spring AOP。毕竟对应用服务组件应用缓存能力是一种装饰.

AOP 切入点 CacheProxyFactoryBean accepts an array of CacheOperationSource objects used to identify the type of cache operation(s) (e.g. GET/PUT, EVICT, etc; for example, the CacheableOperation for the @Cacheable annotation) to perform on the proxy target's methods which are identified

如您所知,one source 应用于(划分)您的应用程序服务方法的缓存启用操作的缓存配置(元数据)来自注释,例如 Spring 的 @Cacheable 注释,与您使用 Spring 的事务管理(使用 @Transactional)或 Spring 安全性的方式没有什么不同。

显然,有来源可以从 XML.

解析(每个)缓存(操作)配置

这些是基础设施 classes,Spring 的缓存基础设施在使用注释或 XML 配置来代理您的应用程序服务组件时本质上是使用 under-the-hood 和应用缓存行为。

您可以自己手动设置所有这些(使用 Java-based 配置)以最小化 Spring 应用程序 classes 中的占用空间,但这是相当多的样板文件只是为了避免在您的应用程序中使用 Spring 类型 [service | DAO/Repository] class 是的,实际上 Spring 已经是您的应用程序的依赖项。

这有点类似于将 JPA 注释用于应用程序域模型 classes(或实体),但实际上更糟糕的是,考虑到 JPA 注释存在于您的域“模型”中 class是的,国际海事组织。

或者,您可以使用 XML(而不是 Java-based 配置)或使用 JSR-107 缓存注释,它们也是 Spring supported

深​​思。