Spring实战之方法级别缓存用法示例
程序员文章站
2023-08-24 19:42:50
本文实例讲述了spring实战之方法级别缓存用法。分享给大家供大家参考,具体如下:
一 配置文件
本文实例讲述了spring实战之方法级别缓存用法。分享给大家供大家参考,具体如下:
一 配置文件
<?xml version="1.0" encoding="gbk"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:cache="http://www.springframework.org/schema/cache" xmlns:context="http://www.springframework.org/schema/context" xsi:schemalocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <context:component-scan base-package="org.crazyit.app.service" /> <cache:annotation-driven cache-manager="cachemanager" /> <!-- 配置ehcache的cachemanager 通过configlocation指定ehcache.xml文件的位置 --> <bean id="ehcachemanager" class="org.springframework.cache.ehcache.ehcachemanagerfactorybean" p:configlocation="classpath:ehcache.xml" p:shared="false" /> <!-- 配置基于ehcache的缓存管理器 并将ehcache的cachemanager注入该缓存管理器bean --> <bean id="cachemanager" class="org.springframework.cache.ehcache.ehcachecachemanager" p:cachemanager-ref="ehcachemanager"> </bean> </beans>
二 属性文件
<?xml version="1.0" encoding="gbk"?> <ehcache> <diskstore path="java.io.tmpdir" /> <!-- 配置默认的缓存区 --> <defaultcache maxelementsinmemory="10000" eternal="false" timetoidleseconds="120" timetoliveseconds="120" maxelementsondisk="10000000" diskexpirythreadintervalseconds="120" memorystoreevictionpolicy="lru"/> <!-- 配置名为users1的缓存区 --> <cache name="users1" maxelementsinmemory="10000" eternal="false" overflowtodisk="true" timetoidleseconds="300" timetoliveseconds="600" /> <cache name="users2" maxelementsinmemory="10000" eternal="false" overflowtodisk="true" timetoidleseconds="300" timetoliveseconds="600" /> </ehcache>
三 领域模型
package org.crazyit.app.domain; public class user { private string name; private int age; public user() {} public user(string name, int age) { super(); this.name = name; this.age = age; } public string getname() { return name; } public void setname(string name) { this.name = name; } public int getage() { return age; } public void setage(int age) { this.age = age; } }
四 service
1 接口类
package org.crazyit.app.service; import org.crazyit.app.domain.user; public interface userservice { user getusersbynameandage(string name, int age); user getanotheruser(string name, int age); }
2 实现类
package org.crazyit.app.service.impl; import org.crazyit.app.service.userservice; import org.crazyit.app.domain.user; import org.springframework.stereotype.service; import org.springframework.cache.annotation.cacheable; import org.springframework.context.annotation.scope; @service("userservice") public class userserviceimpl implements userservice { @cacheable(value = "users1") public user getusersbynameandage(string name, int age) { system.out.println("--正在执行findusersbynameandage()查询方法--"); return new user(name, age); } @cacheable(value = "users2") public user getanotheruser(string name, int age) { system.out.println("--正在执行findanotheruser()查询方法--"); return new user(name, age); } }
五 测试类
package lee; import org.crazyit.app.service.userservice; import org.crazyit.app.domain.user; import org.springframework.context.applicationcontext; import org.springframework.context.support.classpathxmlapplicationcontext; public class springtest { public static void main(string[] args) { applicationcontext ctx = new classpathxmlapplicationcontext("beans.xml"); userservice us = ctx.getbean("userservice" , userservice.class); // 第一次调用us对象的方法时会执行该方法,并缓存方法的结果 user u1 = us.getusersbynameandage("孙悟空", 500); // 由于getanotheruser()方法使用另一个缓存区, // 因此无法使用getusersbynameandage()方法缓存区的数据。 user u2 = us.getanotheruser("孙悟空", 500); system.out.println(u1 == u2); // 输出false // getanotheruser("孙悟空", 500)已经执行过一次,故下面代码使用缓存 user u3 = us.getanotheruser("孙悟空", 500); system.out.println(u2 == u3); // 输出true } }
六 测试结果
--正在执行findusersbynameandage()查询方法--
--正在执行findanotheruser()查询方法--
false
true