Printemps 3.1 @Cacheable - méthode encore exécuté
Je suis en train de mettre en œuvre le Printemps 3.1 mise en cache comme expliqué ici et ici, mais il ne semble pas fonctionner: ma méthode est exécutée à chaque fois, même s'il est marqué @cacheable. Ce que je fais mal?
J'ai déménagé dans un cas de test junit avec son propre fichier de configuration de l'isoler du reste de ma demande, mais le problème se produit toujours. Voici les fichiers:
Spring-test-servlet.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:cache="http://www.springframework.org/schema/cache"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd">
<cache:annotation-driven />
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager" p:cache-manager-ref="ehcache"/>
<bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"
p:config-location="classpath:ehcache.xml"/>
</beans>
ehcache.xml
<ehcache>
<diskStore path="java.io.tmpdir"/>
<cache name="cache"
maxElementsInMemory="100"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
maxElementsOnDisk="10000000"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU"/>
</ehcache>
MyTest.java
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:spring-test-servlet.xml"})
@Component
public class MyTest extends TestCase {
@Test
public void testCache1(){
for(int i = 0; i < 5; i++){
System.out.println("Calling someMethod...");
System.out.println(someMethod(0));
}
}
@Cacheable("testmethod")
private int someMethod(int val){
System.out.println("Not from cache");
return 5;
}
}
Pertinentes Pom entrées: (printemps-version = 3.1.1.De presse)
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache-core</artifactId>
<version>2.5.1</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
quand je lance le test, Printemps, met quelques messages de débogage qui ressemble à mon cache est initialisé sans erreurs
DEBUG: config.ConfigurationHelper - No CacheManagerEventListenerFactory class specified. Skipping...
DEBUG: ehcache.Cache - No BootstrapCacheLoaderFactory class specified. Skipping...
DEBUG: ehcache.Cache - CacheWriter factory not configured. Skipping...
DEBUG: config.ConfigurationHelper - No CacheExceptionHandlerFactory class specified. Skipping...
DEBUG: store.MemoryStore - Initialized net.sf.ehcache.store.MemoryStore for cache
DEBUG: disk.DiskStorageFactory - Failed to delete file cache.data
DEBUG: disk.DiskStorageFactory - Failed to delete file cache.index
DEBUG: disk.DiskStorageFactory - Matching data file missing (or empty) for index file. Deleting index file /var/folders/qg/xwdvsg6x3mx_z_rcfvq7lc0m0000gn/T/cache.index
DEBUG: disk.DiskStorageFactory - Failed to delete file cache.index
DEBUG: ehcache.Cache - Initialised cache: cache
DEBUG: config.ConfigurationHelper - CacheDecoratorFactory not configured. Skipping for 'cache'.
DEBUG: config.ConfigurationHelper - CacheDecoratorFactory not configured for defaultCache. Skipping for 'cache'.
mais la sortie de débogage montre pas de cache vérifie entre les appels de méthode à someMethod et l'instruction d'impression à partir de l'intérieur de someMethod imprime à chaque fois.
Est-il quelque chose que je suis absent?
Vous devez vous connecter pour publier un commentaire.
De http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/cache.html
et
someMethod
dans le même objet cible.@Cacheable
méthode n'est pas public.Vous avez besoin de définir un cache qui correspond au nom que vous référencez dans vous annotation ("testmethod"). Créer une entrée dans votre ehcache.xml pour que cache ainsi.
En plus de Lee Chee Kiam: Voici ma solution pour les petits projets de marginal, et l'utilisation de contournement de la (non annotée) les appels de méthode. Le DAO est tout simplement injecté en lui-même comme un proxy et il appelle ses propres méthodes utilisant des proxy au lieu d'un simple appel de méthode. Donc @Cacheable est considéré comme sans faire compliqué insturmentation.
En-documentation du code est fortement advidsed, comme il peut sembler étrange à ses collègues. Mais il est facile de tester, simple, rapide à réaliser et de pièces de rechange moi la pleine soufflé AspectJ instrumentation. Cependant, pour plus d'utilisation intensive je voudrais aussi des conseils de la AspectJ solution que Lee Chee Kiam fait.