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