【问题标题】:Caching superclass methods with Spring 3.2 and EHCache使用 Spring 3.2 和 EHCache 缓存超类方法
【发布时间】:2016-09-23 07:49:51
【问题描述】:

我有以下场景:

  • 春季 3.2
  • EHCache
  • 一个不能被修改的超类(在一个 jar 中),结构类似这样:

    public abstract class SuperClass<E extends Object> implements SuperIface<E> {
        public void insert(E entity) {
    
        }
    }
    
  • 一个子类,(可以修改),在@CacheEvict中具有这种结构和稍微复杂一点的条件

    import org.springframework.cache.annotation.CacheEvict;
    import org.springframework.stereotype.Service;
    
    @Service
    @CacheEvict(value = "entityCache", allEntries = true, condition = "'insert'.equals(#root.methodName)")
    public class SubClass extends SuperClass<Entity> implements ISubIface {
        public void anotherMethod() {
    
        }
    }
    

SuperClassinsert 方法被调用时,是否有任何选项说 Spring 使 @CacheEvict 注释有效?换句话说,当从 SubClass 实例调用 insert 方法时,我可以删除缓存条目吗?

请注意,我正在寻找通过配置实现此目的的方法。我知道我可以在子类中覆盖超类的方法,但在某些情况下(超类中的另一个逻辑)我不想这样做。

【问题讨论】:

    标签: java spring caching ehcache spring-cache


    【解决方案1】:

    如果您无法更改来源,您可以创建cache advices on any class you want using xml configuration

    话虽如此,您的示例对我来说没有多大意义:该类是abstract,因此您实际上需要一个实现来调用该方法。您是说您有多个实现并且您希望所有这些实现都具有CacheEvict 行为吗?如果你只有一个,我看不出有覆盖只是调用super + 注释的问题。

    【讨论】:

    • 超类有一些常见的 CRUD 方法(带有额外的逻辑),这些方法在他的子类之间共享。子类(应用程序中的真实服务)只指定参数化类型&lt;E extends Object&gt;,并添加一些自定义方法。如果每个服务中的类级缓存注释不仅会影响他声明的方法,还会影响从抽象超类继承的“CRUD”方法,那就太好了。我可以声明多个缓存建议,但我需要为每个服务做。
    • @CacheEvict 在课堂上对我来说完全没有意义。它没有做任何事情,但您肯定不希望所述类的所有公共方法驱逐数据。恐怕如果要共享缓存方面,则需要在抽象类上可以这么说。
    • 我不同意你的看法。这是真的,任何缓存蚂蚁。在类级别可以对所有方法(甚至是继承的方法)具有作用域,但这并不意味着您无法控制它会影响每个方法。所有 Spring Cache 安。拥有condition 属性,您可以控制它在哪些情况下应用缓存,例如,使用Spring 表达式语言。 @CacheEvict(value = "entityCache",allEntries = true,condition = "'insert'.equals(#root.methodName)") 这是一个例子。使用这种方法,您可以在每个特定的 Service 中指定缓存名称,并共享从超类继承的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    • 2016-05-05
    • 2016-08-24
    • 2017-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多