2

我试图用 EHcache 实现 Spring 3.1 缓存。当我运行代码时,它总是运行方法实现并且从不使用缓存:有我的代码:

豆类.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <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"
    xsi:schemaLocation="
    http://www.springframework.org/schema/beans         http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
    http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-3.1.xsd"
    xmlns:p="http://www.springframework.org/schema/p"
    >
    <cache:annotation-driven cache-manager="cacheManager"/>

    <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
        <property name="cacheManager"><ref local="ehcache"/></property>
    </bean>
    <bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" >
        <property name="configLocation" value="classpath:ehcache.xml"/>
    </bean>
    <bean id="testDAO" class="com.sura.test.ejb.TestDAO" />

</beans>

ehcache.xml:

   <?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd" updateCheck="false">

    <defaultCache eternal="false" maxElementsInMemory="1000"
        overflowToDisk="false" diskPersistent="false" timeToIdleSeconds="0"
        timeToLiveSeconds="600" memoryStoreEvictionPolicy="LRU"/>

    <cache name="testCache" eternal="false"
        maxElementsInMemory="100" overflowToDisk="false" diskPersistent="false"
        timeToIdleSeconds="10" timeToLiveSeconds="60"
        memoryStoreEvictionPolicy="LRU" 
         />

    </ehcache>

道:

  import org.springframework.cache.annotation.Cacheable;


    public class TestDAO implements ITestDAO{
    @Cacheable( value = "testCache" , key = "#dpto")
    public List<String> getCiudad(String dpto){
        System.out.println("cargando id:" + dpto);
        List<String> retorno = new ArrayList<String>();
        retorno .add("1- "+dpto);
        return retorno;
    }
    }

这是我的主要课程:

public static void main(String[] args) {
        Testing t = new Testing();
        t.testCache();

    }

    public void testCache(){
        ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:beans.xml");
        TestDAO tdao = new TestDAO();       
        tdao.getCiudad("1");
        tdao.getCiudad("1");
        tdao.getCiudad("1");
        tdao.getCiudad("1");
    }

控制台输出:

9/11/2012 03:13:58 PM org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@206be24: startup date [Fri Nov 09 15:13:58 COT 2012]; root of context hierarchy
9/11/2012 03:13:59 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [beans.xml]
9/11/2012 03:13:59 PM org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@213db0d: defining beans [org.springframework.aop.config.internalAutoProxyCreator,org.springframework.cache.annotation.AnnotationCacheOperationSource#0,org.springframework.cache.interceptor.CacheInterceptor#0,org.springframework.cache.config.internalCacheAdvisor,cacheManager,ehcache,testDAO]; root of factory hierarchy
9/11/2012 03:13:59 PM org.springframework.cache.ehcache.EhCacheManagerFactoryBean afterPropertiesSet
INFO: Initializing EHCache CacheManager
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

cargando id:1
cargando id:1
cargando id:1
cargando id:1

4个方法调用并且没有使用缓存,有谁知道怎么回事?

4

1 回答 1

1

您正在使用 new 实例化 dao,而不是使用 spring,因此它不会应用 spring 注释,因为它不是由 spring 管理的。

于 2012-11-09T20:29:37.617 回答