2012-07-13 9 views
8

Ich muss eine bestimmte EhCache-Instanz anhand ihres Namens ermitteln und würde es vorziehen, wenn möglich zu autowire. Wie kann ich den folgenden automatisch konfigurierten Controller in der Cache-Instanz, die ich suche, automatisch ansteuern?Eine EhCache-Instanz mit Spring ... intelligent abrufen

@Controller 
public class MyUniqueService { 
    ... 
} 

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

Wie konfiguriere ich ehcache in meinem Anwendungskontext? Ich sehe keine Protokollnachrichten von EhCache über das Laden der ehcache.xml-Datei in meinem Verzeichnis /WEB-INF/. Wie kann ich es laden?

Wie kann ich ehcache mit meiner Feder-Anwendung zu integrieren, um es den ehcache.xml Datei von meinem /WEB-INF/ Verzeichnis laden und einen Cache von einem gegebenen Namen in mein MyUniqueService Controller autowire?

Antwort

16

Zuerst müssen Sie in Ihnen app Kontext wie dies einen Ehcache Cachemanager Singleton erstellen:

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

Hier configLocation gesetzt von Classpath zu laden oder value="/WEB-INF/my-ehcache.xml" verwenden.

In Ihrem Controller einfach injizieren, um die CacheManager Beispiel:

@Controller 
public class MyUniqueService { 

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

    ... 
} 

Alternativ, wenn Sie die "völlig autowired" -Route, tun gehen möchten:

<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> 

der Setup Klasse wie folgt:

@Controller 
public class MyUniqueService { 

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

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

uniqueObjectCache entspricht in Ihrer ehcache.xml Cache Definition dieser Cache-Instanz:

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

Es gibt keine Möglichkeit, eine tatsächliche Cache-Instanz zu injizieren, aber, wie oben gezeigt, können Sie einen Cache-Manager und verwenden Sie es spritzen zu bekommen der Cache, an dem Sie interessiert sind.

7

In der Tat! Oder wenn Sie eine Java-Config-Klasse verwenden möchten:

 @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

Sie können auch autowire verwenden, wenn der Kontext eine Bohne mit der richtigen Klasse zu finden. Hier ist, wie ich meine konfiguriert 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> 

Und meine Java-Klasse

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

Dieses Setup funktioniert für mich.

+0

Dies ist natürlich vorausgesetzt, Sie haben nur einen Cache –

+1

@ ClintonBosch - Wenn Sie mehrere haben, verwenden Sie nur '@Qualifier ('CacheBeanId')' mit '@ Autowired' – moshen

16

Angenommen, Sie haben Cachemanager definiert:

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

Sie erhalten/injizieren spezifische Cache wie folgt aus:

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

Siehe auch Beispiele dafür, wie in der @Value()http://www.mkyong.com/spring3/spring-el-method-invocation-example/ Frühling EL verwenden, wenn Sie interessiert sind, .

Verwandte Themen