在上文《Spring集成memcached的详细介绍》中给大家介绍了一下在Spring中通过获取MemCachedClient来实现与memcached服务器进行数据读取的方式。不过,在实际开发中,我们往往是通过Spring的@Cacheable来实现数据的缓存的,所以,本文给大家详细介绍一下@Cacheable的用法。首先,在使用@Cacheable之前,我们要做好准备工作。
第一步:要导入相应的jar包。
<classpathentry kind="lib" path="lib/spring-core-4.1.4.RELEASE.jar"/>
<classpathentry kind="lib" path="lib/spring-cache-1.0.10.jar"/>
<classpathentry kind="lib" path="lib/spring-context-4.1.4.RELEASE.jar"/>
<classpathentry kind="lib" path="lib/spring-beans-4.1.4.RELEASE.jar"/>
<classpathentry kind="lib" path="lib/commons-logging-1.2.jar"/>
<classpathentry kind="lib" path="lib/log4j-1.2.17.jar"/>
<classpathentry kind="lib" path="lib/spring-expression-4.1.4.RELEASE.jar"/>
<classpathentry kind="lib" path="lib/java_memcached-release_2.0.1.jar"/>
<classpathentry kind="lib" path="lib/spring-aop-4.1.4.RELEASE.jar"/>
<classpathentry kind="lib" path="lib/spring-aspects-4.1.4.RELEASE.jar"/>
<classpathentry kind="lib" path="lib/spring-context-support-4.1.4.RELEASE.jar"/>
<classpathentry kind="lib" path="lib/spring-tx-4.1.4.RELEASE.jar"/>
<classpathentry kind="lib" path="lib/aopalliance-1.0.jar"/>
<classpathentry kind="lib" path="lib/ognl-3.0.6.jar"/>
<classpathentry kind="lib" path="lib/trafficCounter-1.0.2.jar"/>
<classpathentry kind="lib" path="lib/aspectjweaver-1.8.4.jar"/>
<classpathentry kind="lib" path="lib/javassist-3.11.0.GA.jar"/>
第二步:xml文件中增加命名空间。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<
beans
xmlns
=
"http://www.springframework.org/schema/beans"
xmlns
:
xsi
=
"http://www.w3.org/2001/XMLSchema-instance"
xmlns
:
aop
=
"http://www.springframework.org/schema/aop"
xmlns
:
jee
=
"http://www.springframework.org/schema/jee"
xmlns
:
tx
=
"http://www.springframework.org/schema/tx"
xmlns
:
context
=
"http://www.springframework.org/schema/context"
xsi
:
schemaLocation
=
"http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"
>
|
第三步:添加自动扫描功能。
1
2
|
<
context
:
component
-
scan
base
-
package
=
"service"
/
>
<
aop
:
config
proxy
-
target
-
class
=
"true"
/
>
|
第四步:增加缓存管理类。
1
2
3
4
5
6
7
8
9
10
11
|
<
bean
id
=
"memCacheProvider"
class
=
"com.springcache.memcache.MemCacheProvider"
>
<
property
name
=
"memCache"
ref
=
"memCacheClient"
/
>
<
/
bean
>
<
bean
id
=
"cacheManager"
class
=
"com.springcache.CacheManager"
>
<
property
name
=
"elParserName"
value
=
"ognl"
/
>
<
property
name
=
"cacheProviders"
>
<
map
>
<
entry
key
=
"remote"
value
-
ref
=
"memCacheProvider"
>
<
/
entry
>
<
/
map
>
<
/
property
>
<
/
bean
>
|
第五步:建立一个测试类。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
package
service
;
import
org
.
springframework
.
stereotype
.
Service
;
import
com
.
springcache
.
annotation
.
Cacheable
;
@
Service
@
Cacheable
public
class
MemcachedService
{
@
Cacheable
(
name
=
"remote"
,
key
=
"'USER_NAME_'+#args[0]"
,
expire
=
60
)
public
String
storeUserName
(
String
accountId
,
String
name
)
{
return
name
;
}
@
Cacheable
(
name
=
"remote"
,
expire
=
60
)
public
String
storeUserAddress
(
String
accountId
,
String
address
)
{
return
address
;
}
}
|
@Cacheable支持如下几个参数:
key:缓存的key,默认为空,既表示使用方法的参数类型及参数值作为key,支持SpEL。例如:
memCachedService.storeUserAddress("user", "BeiJing");
所以对应的key为:service.MemcachedService-storeUserAddress_user_BeiJing
name:存储位置。在本来中remote表示使用memcached服务器。
condition:触发条件,只有满足条件的情况才会加入缓存,默认为空,既表示全部都加入缓存,支持SpEL。
expire:过期时间,单位为秒。
最后总结一下:当执行到一个被@Cacheable注解的方法时,Spring首先检查condition条件是否满足,如果不满足,执行方法,返回;如果满足,在name所命名的缓存空间中查找使用key存储的对象,如果找到,将找到的结果返回,如果没有找到执行方法,将方法的返回值以key-value对象的方式存入name缓存中,然后方法返回。