Spring 4.2.4(不使用 spring 引导)+ EhCache 3 + Hibernate 4.2.1
Spring 4.2.4 (not using spring boot) + EhCache 3 + Hibernate 4.2.1
是否有人使用 Spring 4.2(不使用 Spring 启动)实现了 EhCache 3。如果是这样,实施步骤是什么?
问题是 spring-context-support(它添加了 Spring 的缓存注释)期望 Ehcache 的 CacheManager 位于这个 class 路径上:net.sf.ehcache.CacheManager
然而,在 Ehcache 3 中,CacheManager class 位于另一个 class 路径:org.ehcache.CacheManager.
所以,基本上spring-context-support不支持Ehcache 3。而且你必须直接使用JSR-107注解,而不是Spring提供的注解。
如果有人实现了这个组合,请给你ehcache.xml和spring配置以供参考。
我建议您依赖 JSR-107(又名 JCache,JVM 上缓存的标准 API)Spring 支持,然后在类路径中添加 ehcache3。
您还可以使用 Spring 自己的注释,它与 JSR 107 的注释集成得非常好:Spring 已经支持 JSR-107 近 4 年了:https://spring.io/blog/2014/04/14/cache-abstraction-jcache-jsr-107-annotations-support.
我邀请您访问上面的博客 post 及其链接到的文档,您的用例非常标准并且得到了很好的支持。欢迎提出更多问题。
Ehcache 3 通过 JSR-107 使用。这是一个例子。
你的pom.xml
:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.2.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>3.5.0</version>
</dependency>
<dependency>
<groupId>javax.cache</groupId>
<artifactId>cache-api</artifactId>
<version>1.1.0</version>
</dependency>
您的ehcache.xml
(在类路径的根目录):
<?xml version="1.0" encoding="UTF-8"?>
<config
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
xmlns:jsr107='http://www.ehcache.org/v3/jsr107'
xmlns='http://www.ehcache.org/v3'
xsi:schemaLocation="
http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core-3.4.xsd
http://www.ehcache.org/v3/jsr107 http://www.ehcache.org/schema/ehcache-107-ext-3.4.xsd">
<service>
<jsr107:defaults enable-management="false" enable-statistics="true"/>
</service>
<cache alias="cache">
<resources>
<heap unit="entries">2000</heap>
</resources>
</cache>
</config>
使用缓存的示例应用程序:
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.jcache.JCacheCacheManager;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.net.URISyntaxException;
import javax.cache.Caching;
@EnableCaching
@Configuration
public class App {
private static int value = 0;
@Bean
public CacheManager cacheManager() throws URISyntaxException {
return new JCacheCacheManager(Caching.getCachingProvider().getCacheManager(
getClass().getResource("/ehcache.xml").toURI(),
getClass().getClassLoader()
));
}
public static void main( String[] args ) {
ApplicationContext context = new AnnotationConfigApplicationContext(App.class);
App app = context.getBean(App.class);
System.out.println(app.incValue());
System.out.println(app.incValue()); // still return 0
}
@Cacheable("cache")
public int incValue() {
return value++;
}
}
是否有人使用 Spring 4.2(不使用 Spring 启动)实现了 EhCache 3。如果是这样,实施步骤是什么?
问题是 spring-context-support(它添加了 Spring 的缓存注释)期望 Ehcache 的 CacheManager 位于这个 class 路径上:net.sf.ehcache.CacheManager
然而,在 Ehcache 3 中,CacheManager class 位于另一个 class 路径:org.ehcache.CacheManager.
所以,基本上spring-context-support不支持Ehcache 3。而且你必须直接使用JSR-107注解,而不是Spring提供的注解。
如果有人实现了这个组合,请给你ehcache.xml和spring配置以供参考。
我建议您依赖 JSR-107(又名 JCache,JVM 上缓存的标准 API)Spring 支持,然后在类路径中添加 ehcache3。
您还可以使用 Spring 自己的注释,它与 JSR 107 的注释集成得非常好:Spring 已经支持 JSR-107 近 4 年了:https://spring.io/blog/2014/04/14/cache-abstraction-jcache-jsr-107-annotations-support.
我邀请您访问上面的博客 post 及其链接到的文档,您的用例非常标准并且得到了很好的支持。欢迎提出更多问题。
Ehcache 3 通过 JSR-107 使用。这是一个例子。
你的pom.xml
:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.2.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>3.5.0</version>
</dependency>
<dependency>
<groupId>javax.cache</groupId>
<artifactId>cache-api</artifactId>
<version>1.1.0</version>
</dependency>
您的ehcache.xml
(在类路径的根目录):
<?xml version="1.0" encoding="UTF-8"?>
<config
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
xmlns:jsr107='http://www.ehcache.org/v3/jsr107'
xmlns='http://www.ehcache.org/v3'
xsi:schemaLocation="
http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core-3.4.xsd
http://www.ehcache.org/v3/jsr107 http://www.ehcache.org/schema/ehcache-107-ext-3.4.xsd">
<service>
<jsr107:defaults enable-management="false" enable-statistics="true"/>
</service>
<cache alias="cache">
<resources>
<heap unit="entries">2000</heap>
</resources>
</cache>
</config>
使用缓存的示例应用程序:
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.jcache.JCacheCacheManager;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.net.URISyntaxException;
import javax.cache.Caching;
@EnableCaching
@Configuration
public class App {
private static int value = 0;
@Bean
public CacheManager cacheManager() throws URISyntaxException {
return new JCacheCacheManager(Caching.getCachingProvider().getCacheManager(
getClass().getResource("/ehcache.xml").toURI(),
getClass().getClassLoader()
));
}
public static void main( String[] args ) {
ApplicationContext context = new AnnotationConfigApplicationContext(App.class);
App app = context.getBean(App.class);
System.out.println(app.incValue());
System.out.println(app.incValue()); // still return 0
}
@Cacheable("cache")
public int incValue() {
return value++;
}
}