2012-07-13 12 views
8

Necesito obtener una instancia específica de EhCache por nombre y preferiría unirme de ser posible. Dado el siguiente controlador configurado automáticamente, ¿cómo puedo realizar el autoenvío en la instancia de caché que estoy buscando?Obteniendo una instancia de EhCache con Spring ... inteligentemente

@Controller 
public class MyUniqueService { 
    ... 
} 

<beans ...> 
    <ctx:component-scan base-package="my.controllers"/> 
    <mvc:annotation-driven /> 
</beans> 

¿Cómo configuro Ehcache en mi contexto de aplicación? No veo ningún mensaje de registro de EhCache sobre cómo cargar el archivo ehcache.xml en mi directorio /WEB-INF/. ¿Cómo hago que lo cargue?

¿Cómo puedo integrar Ehcache con mi solicitud de Primavera para hacer que cargue el archivo ehcache.xml de mi directorio /WEB-INF/ y Autowire un caché por un nombre dado en mi controlador de MyUniqueService?

Respuesta

16

primer lugar usted necesita para crear un producto único Ehcache CacheManager en que contexto aplicación como esta:

<bean id="myEhCacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"> 
    <property name="configLocation" value="classpath:my-ehcache.xml"/> 
</bean> 

Aquí configLocation se pone a cargar desde la ruta de clases o utilizar value="/WEB-INF/my-ehcache.xml".

En su controlador simplemente inyectar el CacheManager ejemplo:

@Controller 
public class MyUniqueService { 

    @Resource(name="myEhCacheManager") 
    private CacheManager cacheManager; 

    ... 
} 

Alternativamente, si desea ir a la ruta "totalmente autowired", hacer:

<bean class="org.springframework.cache.ehcache.EhCacheCacheManager"> 
    <property name="cacheManager"> 
     <bean class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"> 
      <property name="configLocation" value="/WEB-INF/ehcache.xml"/> 
     </bean> 
    </property> 
</bean> 

Configuración de su clase como tal:

@Controller 
public class MyUniqueService { 

    @Autowired 
    private org.springframework.cache.CacheManager cacheManager; 

    public org.springframework.cache.Cache getUniqueObjectCache() { 
     return cacheManager.getCache("uniqueObjectCache"); 
    } 
} 

uniqueObjectCache corresponde a esta instancia de memoria caché en su definición ehcache.xml caché:

<cache name="uniqueObjectCache" 
     maxElementsInMemory="10000" 
     eternal="false" 
     timeToIdleSeconds="300" 
     timeToLiveSeconds="600" 
     memoryStoreEvictionPolicy="LRU" 
     transactionalMode="off"/> 

No hay una manera de inyectar una instancia caché real, pero como se muestra arriba, se puede inyectar un gestor de memoria caché y utilizarla para conseguir el caché que le interesa.

7

¡De hecho! O si desea utilizar una clase java configuración:

 @Inject 
     private ResourceLoader resourceLoader; 

     @Bean 
     public CacheManager cacheManager() { 
      EhCacheCacheManager ehCacheCacheManager = new EhCacheCacheManager(); 
      try { 
       ehCacheCacheManager.setCacheManager(ehcacheCacheManager().getObject()); 
      } catch (Exception e) { 
       throw new IllegalStateException("Failed to create an EhCacheManagerFactoryBean", e); 
      } 
      return ehCacheCacheManager; 
     } 

     @Bean 
     public FactoryBean<net.sf.ehcache.CacheManager> ehcacheCacheManager() { 
      EhCacheManagerFactoryBean bean = new EhCacheManagerFactoryBean(); 
      bean.setConfigLocation(resourceLoader.getResource("classpath:ehcache.xml")); 
      return bean; 
     } 
9

También puede utilizar Autowire si el contexto se puede encontrar un grano con la clase correcta. Así es como he configurado mi xml

<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"> 
    <property name="configLocation"> 
     <value>WEB-INF/ehcache.xml</value> 
    </property> 
</bean> 

<bean id="cache" class="net.sf.ehcache.Cache" factory-bean="cacheManager" factory-method="getCache"> 
    <constructor-arg value="CacheNameHere" />   
</bean> 

Y mi clase java

@Autowired 
private net.sf.ehcache.Cache cache; 

Esta configuración funciona para mí.

+0

Esto, por supuesto, suponiendo que solo tiene un caché –

+1

@ClintonBosch - Si tiene más de uno, simplemente use '@Qualifier ('cacheBeanId')' con '@ Autowired' – moshen

16

Asumiendo que tiene cacheManager define:

<bean id="cacheManager" 
    class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"> 
    <property name="configLocation" value="classpath:/ehcache.xml"/> 
</bean> 

, usted puede obtener/inyectar caché específica de esta manera:

@Value("#{cacheManager.getCache('myCacheName')}") 
private Cache myCache; 

Véase también ejemplos de cómo usar un muelle EL dentro del @Value()http://www.mkyong.com/spring3/spring-el-method-invocation-example/ si está interesado .

Cuestiones relacionadas