问题描述
ehcache主配置如下:<!--配置ehcache缓存管理器--><beanid="cacheManager"class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"><propertyname="configLocation"value="classpath:ehcache/ehcache.xml"/><propertyname="shared"value="true"/></bean><!--配置一个简单的缓存工厂bean对象--><beanid="simpleCache"class="org.springframework.cache.ehcache.EhCacheFactoryBean"><propertyname="cacheManager"ref="cacheManager"/><!--使用缓存关联ehcache.xml中的缓存配置--><propertyname="cacheName"value="mobileCache"/></bean><!--配置一个缓存拦截器对象,处理具体的缓存业务--><beanid="methodCacheInterceptor"class="com.scxxs.ehcache.MethodCacheInterceptor"><propertyname="cache"ref="simpleCache"/></bean><!--配置一个缓存拦截器对象,处理具体的缓存业务--><beanid="methodCacheAfterAdvice"class="com.scxxs.ehcache.MethodCacheAfterAdvice"><propertyname="cache"ref="simpleCache"/></bean><!--参与缓存的切入点对象(切入点对象,确定何时何地调用拦截器)--><beanid="methodCachePointCut"class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"><!--配置缓存aop切面--><propertyname="advice"ref="methodCacheInterceptor"/><!--配置哪些方法参与缓存策略--><!--.表示符合任何单一字元
解决方案二:
+表示符合前一个字元一次或多次
解决方案三:
*表示符合前一个字元零次或多次
解决方案四:
Escape任何Regularexpression使用到的符号--><!--.*表示前面的前缀(包括包名)表示print方法--><propertyname="patterns"><list><!--<value>com.scxxs.dao.*get*</value><value>com.scxxs.dao.*find*</value><value>com.scxxs.dao.*query*</value>--><value>.*find.*</value></list></property></bean><!--当发生create,save,insert,update,delete,remove等方法时,就会去flush一下--><beanid="methodCachePointCutAdvice"class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"><propertyname="advice"ref="methodCacheAfterAdvice"/><propertyname="patterns"><list><value>.*add.*</value></list></property></bean>ehcache.xml配置如下:<ehcachexmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:noNamespaceSchemaLocation="ehcache.xsd"><!--设置缓存文件.data的创建路径。如果该路径是Java系统参数,当前虚拟机会重新赋值。下面的参数这样解释:user.home–用户主目录user.dir–用户当前工作目录java.io.tmpdir–默认临时文件路径--><diskStorepath="java.io.tmpdir"/><defaultCachemaxElementsInMemory="10000"eternal="false"timeToIdleSeconds="30"timeToLiveSeconds="30"overflowToDisk="false"/><!--配置自定义缓存maxElementsInMemory:缓存中允许创建的最大对象数eternal:缓存中对象是否为永久的,如果是,超时设置将被忽略,对象从不过期。timeToIdleSeconds:缓存数据的钝化时间,也就是在一个元素消亡之前,两次访问时间的最大时间间隔值,这只能在元素不是永久驻留时有效,如果该值是0就意味着元素可以停顿无穷长的时间。timeToLiveSeconds:缓存数据的生存时间,也就是一个元素从构建到消亡的最大时间间隔值,这只能在元素不是永久驻留时有效,如果该值是0就意味着元素可以停顿无穷长的时间。overflowToDisk:内存不足时,是否启用磁盘缓存。memoryStoreEvictionPolicy:缓存满了之后的淘汰算法。--><cachename="SimplePageCachingFilter"maxElementsInMemory="10000"eternal="false"overflowToDisk="false"timeToIdleSeconds="900"timeToLiveSeconds="1800"memoryStoreEvictionPolicy="LFU"/><cachename="mobileCache"maxElementsInMemory="10000"eternal="false"overflowToDisk="true"timeToIdleSeconds="1800"timeToLiveSeconds="3600"memoryStoreEvictionPolicy="LFU"/></ehcache>applicationContext.xmlspring主配置如下:<beanid="dataSource"class="org.springframework.jdbc.datasource.DriverManagerDataSource"><propertyname="driverClassName"><value>com.mysql.jdbc.Driver</value></property><propertyname="url"><value>jdbc:mysql://127.0.0.1:3306/mytest</value></property><propertyname="username"><value>root</value></property><propertyname="password"><value>root</value></property></bean>
解决方案
解决方案五:
<!--配置事务管理器--><beanid="transcationManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><propertyname="dataSource"ref="dataSource"/></bean><beanid="sqlSessionFactory"class="org.mybatis.spring.SqlSessionFactoryBean"><propertyname="dataSource"ref="dataSource"/><propertyname="configLocation"value="classpath:ibatis/SqlMapConfig.xml"/><!--src/WEB-INF/<propertyname="mapperLocations"value="classpath*:com/xxt/ibatis/dbcp/domain/user.map.xml"/>--></bean><beanid="sqlSession"class="org.mybatis.spring.SqlSessionTemplate"><constructor-argindex="0"ref="sqlSessionFactory"/></bean><tx:adviceid="txAdvice"transaction-manager="transcationManager"><tx:attributes><tx:methodname="insert*"propagation="REQUIRED"/><tx:methodname="del*"propagation="REQUIRED"/><tx:methodname="update*"propagation="REQUIRED"/><tx:methodname="*"read-only="true"/></tx:attributes></tx:advice><!--配置AOP切入点--><aop:config><aop:pointcutid="allManagerMethod"expression="execution(*com.scxxs.dao.*.*(..))"/><aop:advisoradvice-ref="txAdvice"pointcut-ref="allManagerMethod"/></aop:config><beanid="jdbcTemplate"class="org.springframework.jdbc.core.JdbcTemplate"><propertyname="dataSource"><reflocal="dataSource"/></property></bean><importresource="spring/applicationContext_dao.xml"/><importresource="spring/applicationContext_biz.xml"/><importresource="spring/applicationContext_ehcache.xml"/>我遇到的问题就是,ehcache在配置两个切面的时候报错:2013-01-0614:33:38Destroyingsingletonsinorg.springframework.beans.factory.support.DefaultListableBeanFactory@1aaf64d:definingbeans[dataSource,transcationManager,sqlSessionFactory,sqlSession,txAdvice,org.springframework.aop.config.internalAutoProxyCreator,allManagerMethod,org.springframework.aop.support.DefaultBeanFactoryPointcutAdvisor#0,jdbcTemplate,springDemoDao,userDao,userBiz,cacheManager,simpleCache,methodCacheInterceptor,methodCacheAfterAdvice,methodCachePointCut,methodCachePointCutAdvice];rootoffactoryhierarchy2013-01-0614:33:38Retrieveddependentbeansforbean'cacheManager':[simpleCache]2013-01-0614:33:38Retrieveddependentbeansforbean'simpleCache':[methodCacheAfterAdvice]2013-01-0614:33:38Retrieveddependentbeansforbean'methodCacheAfterAdvice':[methodCachePointCutAdvice]2013-01-0614:33:38Invokingdestroy()onbeanwithname'cacheManager'2013-01-0614:33:38ShuttingdownEHCacheCacheManager2013-01-0614:33:38Contextinitializationfailedorg.springframework.beans.factory.BeanCreationException:Errorcreatingbeanwithname'dataSource'definedinclasspathresource[applicationContext.xml]:BeanPostProcessorbeforeinstantiationofbeanfailed;nestedexceptionisorg.springframework.beans.factory.BeanCreationException:Errorcreatingbeanwithname'methodCachePointCut'definedinclasspathresource[spring/applicationContext_ehcache.xml]:Cannotresolvereferencetobean'methodCacheInterceptor'whilesettingbeanproperty'advice';nestedexceptionisorg.springframework.beans.factory.BeanCreationException:Errorcreatingbeanwithname'methodCacheInterceptor'definedinclasspathresource[spring/applicationContext_ehcache.xml]:Initializationofbeanfailed;nestedexceptionisorg.springframework.beans.ConversionNotSupportedException:Failedtoconvertpropertyvalueoftype'$Proxy4implementingnet.sf.ehcache.terracotta.InternalEhcache,net.sf.ehcache.store.StoreListener,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised'torequiredtype'net.sf.ehcache.Cache'forproperty'cache';nestedexceptionisjava.lang.IllegalStateException:Cannotconvertvalueoftype[$Proxy4implementingnet.sf.ehcache.terracotta.InternalEhcache,net.sf.ehcache.store.StoreListener,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised]torequiredtype[net.sf.ehcache.Cache]forproperty'cache':nomatchingeditorsorconversionstrategyfound
解决方案六:
我试过删除一个切面的话项目是能够完全启动的,<!--配置一个简单的缓存工厂bean对象--><beanid="simpleCache"class="org.springframework.cache.ehcache.EhCacheFactoryBean"><propertyname="cacheManager"ref="cacheManager"/><!--使用缓存关联ehcache.xml中的缓存配置--><propertyname="cacheName"value="mobileCache"/></bean><!--参与缓存的切入点对象(切入点对象,确定何时何地调用拦截器)--><beanid="methodCachePointCut"class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"><!--配置缓存aop切面--><propertyname="advice"ref="methodCacheInterceptor"/><!--配置哪些方法参与缓存策略--><!--.表示符合任何单一字元
解决方案七:
+表示符合前一个字元一次或多次
解决方案八:
*表示符合前一个字元零次或多次
解决方案九:
Escape任何Regularexpression使用到的符号--><!--.*表示前面的前缀(包括包名)表示print方法--><propertyname="patterns"><list><!--<value>com.scxxs.dao.*get*</value><value>com.scxxs.dao.*find*</value><value>com.scxxs.dao.*query*</value>--><value>.*find.*</value></list></property></bean>像上面这种配置有两个删除其中一个都没问题。我还测试过缓存起作用没,当我删除后面那个after切面后项目正常启动且缓存起作用,请教各位大虾为了我两个切面都存在的时候就要报错,报错信息就是上面那种,搞不懂啊!!!!