繁体   English   中英

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应用程序服务类、您的应用程序域类(无论是使用声明式、基于注解的缓存配置和分界,还是声明式、基于 XML 的缓存配置等)都由Spring AOP支持. 毕竟,将缓存功能应用到应用程序服务组件上是一种装饰

CacheProxyFactoryBean 接受一组CacheOperationSource对象,用于识别缓存操作的类型(例如 GET/PUT、 @Cacheable等;例如,@ Cacheable注释的 CacheableOperation)以在代理目标的方法上执行,这些方法被识别通过 AOP 切入点。

如您所知,应用于(划分)您的应用程序服务方法的缓存启用操作的缓存配置(元数据)的一个来源来自注释,例如 Spring 的@Cacheable注释,与您使用 Spring 的事务管理(使用@Transactional )或 Spring 安全。

显然,有来源可以从 XML 解析(每个)缓存(操作)配置。

这些是 Spring 的缓存基础结构在使用注释或 XML 配置来代理您的应用程序服务组件并应用缓存行为时本质上使用的基础结构类。

您可以自己手动设置所有这些(使用基于 Java 的配置)以最小化应用程序类中的 Spring 足迹,但是为了避免应用程序中的 Spring 类型 [service | DAO/Repository] 类,而实际上 Spring 已经是您的应用程序的依赖项。

它有点类似于对应用程序域 model 类(或实体)使用 JPA 注释,但实际上更糟糕的是 JPA 注释存在于您的域“模型”类中,IMO。

或者,您可以使用 XML(而不是基于 Java 的配置)或使用 Spring 也支持的 JSR-107 缓存注释。

引人深思。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM