2012-07-13 10 views
8

Potrzebuję uzyskać konkretną instancję EhCache po nazwie i wolałbym, jeśli to możliwe, przeprowadzić autowyzwarzanie. Biorąc pod uwagę następujący automatycznie skonfigurowany kontroler, w jaki sposób mogę autowire w instancji pamięci podręcznej, której szukam?Uzyskiwanie instancji EhCache ze Spring ... inteligentnie

@Controller 
public class MyUniqueService { 
    ... 
} 

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

Jak skonfigurować ehcache w moim kontekście aplikacji? Nie widzę żadnych komunikatów dziennika z EhCache o tym ładowaniu pliku ehcache.xml w moim katalogu /WEB-INF/. Jak mogę go załadować?

Jak mogę zintegrować ehcache z mojego wniosku wiosennym aby go załadować plik ehcache.xml z mojego katalogu /WEB-INF/ i autowire cache o danej nazwie w moim kontroler MyUniqueService?

Odpowiedz

16

Najpierw trzeba stworzyć ehcache CacheManager singleton kontekstu aplikacji w was tak:

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

Tutaj configLocation jest ustawiony aby załadować od ścieżki klasy lub używać value="/WEB-INF/my-ehcache.xml".

W kontrolerze wystarczy wstrzyknąć instancji CacheManager:

@Controller 
public class MyUniqueService { 

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

    ... 
} 

Alternatywnie, jeśli chcesz, aby przejść do "całkowicie autowired" drogę, zrobić:

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

Skonfiguruj Klasa taka jak:

@Controller 
public class MyUniqueService { 

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

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

uniqueObjectCache odpowiada tej instancji cache w swojej definicji ehcache.xml cache:

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

nie ma sposobu, aby wprowadzić rzeczywistą instancji cache, ale jak wykazano powyżej, można wstrzyknąć menedżera pamięci podręcznej i używać go dostać pamięć podręczna, którą jesteś zainteresowany.

7

Rzeczywiście! Lub jeśli chcesz użyć klasy java config:

 @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

Można również użyć autowire jeżeli z kontekstu nie może znaleźć Bean z właściwej klasy. Oto jak ja skonfigurowany mój 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> 

i mojej klasy java

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

Ta konfiguracja działa dla mnie.

+0

To oczywiście przy założeniu, że masz tylko jedną pamięć podręczną –

+1

@ClintonBosch - Jeśli masz więcej niż jeden, po prostu użyj '@Qualifier ('cacheBeanId')' z '@ Autowired' – moshen

16

Zakładając masz cacheManager zdefiniowane:

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

Możesz dostać/wstrzykiwać konkretny cache tak:

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

Patrz także Przykłady Sposób korzystania Wiosna EL wewnątrz @Value()http://www.mkyong.com/spring3/spring-el-method-invocation-example/ jeśli jesteś zainteresowany .