Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.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

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 什么';这是ehcache上@Cacheable方法和@Cacheable类之间的区别_Java_Spring_Hibernate_Ehcache - Fatal编程技术网

Java 什么';这是ehcache上@Cacheable方法和@Cacheable类之间的区别

Java 什么';这是ehcache上@Cacheable方法和@Cacheable类之间的区别,java,spring,hibernate,ehcache,Java,Spring,Hibernate,Ehcache,使用ehcache时,我注意到@Cacheable注释可以在类declaration或方法declaration之上使用,例如 可缓存类: @Cacheable class CacheableClass{ Long l; Integer i; String s; } 可缓存方法: class ... @Cacheable public List<ToBeCached> getCacheableCla

使用ehcache时,我注意到@Cacheable注释可以在类declaration或方法declaration之上使用,例如

可缓存类:

@Cacheable
class CacheableClass{
    Long l;
    Integer i;
    String s;


}
可缓存方法:

    class ...
            @Cacheable
            public List<ToBeCached> getCacheableClassList()
            {
                    ...
            }
类。。。
@可缓存
公共列表getCacheableClassList()
{
...
}

如果@Cacheable位于一个类的顶部,那么您就不能给出chache的名称,但是如果您在一个方法的顶部声明,那么您可以给出在配置xml中声明的缓存的名称。我想我错过了一些东西,因为使用@Cacheable进行类删除对我来说似乎太难了。

在方法级别使用@Cacheable意味着,方法的结果会被缓存。 在接口级别使用@Cacheable用于定义自定义注释,如下所示:

//自定义注释

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
@Cacheable(value="books", key="#isbn")
public @interface SlowService {
}
下面的代码

@Cacheable(value="books", key="#isbn")
public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)
可以替换为

@SlowService
public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)

但我从未见过在类级别应用@Cacheable注释。

使用ehcache-spring注释:

@com.googlecode.ehcache.annotations.Cacheable(cacheName=“test”)如果我们在类型级别给出这个值,那么它会给出一个错误,说明这个位置不允许使用注释@Cacheable

根据我读过的文档注释位置:

  • 关于一种方法
  • 在接口上或
  • 关于类上的公共方法
  • Spring建议只使用@Cacheable注释注释具体类的方法,而不是注释接口的方法。

    使用代理时,应仅将@Cacheable注释应用于具有公共可见性的方法。如果使用@Cacheable注释对受保护的、私有的或包可见的方法进行注释,则不会引发错误,但注释的方法不会显示已配置的可缓存设置

    使用Spring缓存

    如果使用@org.springframework.cache.annotation.Cacheable(value=“test”),其中value表示缓存的名称。您可以在类型和/或方法级别指定它。

    您可以尝试此操作并判断是否出现错误:-

    @com.googlecode.ehcache.annotations.Cacheable(cacheName = "test")
    @org.springframework.cache.annotation.Cacheable(value="")
    public class PortalDatabaseAdapterImpl{
    
        @com.googlecode.ehcache.annotations.Cacheable(cacheName="test")
        @org.springframework.cache.annotation.Cacheable(value="test")
        public List<PageControl> getLoginPage() {}
    }
    
    @com.googlecode.ehcache.annotations.Cacheable(cacheName=“test”)
    @org.springframework.cache.annotation.Cacheable(value=”“)
    公共类PortalDatabaseAdapterImpl{
    @com.googlecode.ehcache.annotations.Cacheable(cacheName=“test”)
    @org.springframework.cache.annotation.Cacheable(value=“test”)
    公共列表getLoginPage(){}
    }
    

    如果您没有收到错误,那么我必须更新自己。

    我不清楚上面的代码(findBook方法)的作用。它是否也从缓存中提取?假设预先缓存了这本书,并调用了findBook方法,它应该返回这本书。它是否直接返回book而不是运行方法?或者只是缓存返回值?哪个@Cacheable u r使用-javax、spring缓存或任何其他第三方缓存?是的,你说得对,对于类@Cacheable来自hibernate。。。这令人恼火,令人困惑。那怎么办?还有什么区别?