봄 캐싱 메커니즘 (RPM)

봄 캐싱 메커니즘은 매우 유연하고이 캐싱 메커니즘은 모든 수준의 JavaEE 어플 응용 프로그램에서 캐시 할 수 있도록, 어떤 용기 나 콩 콩 방법에 캐시 할 수 있습니다.

봄 기본 캐시 등으로 Ehcache (최대 절전 모드 캐싱 도구)를 달성하기 위해 다른 도구의 도움을 필요로 또한 최고 장소 통합 API 프로그래밍을 버퍼.

봄 캐시를 사용하려면 세 가지 단계를 수행

  • 봄 구성 파일 1. 가져 오기 컨텍스트 : 네임 스페이스
  • 2. 스프링 프로필 캐시는 특히 활성화 된 첨가 <캐시 : 주석 기반 캐시 매니저 = "캐쉬 관리 ID"/>
  • 이 EHCache는 경우 3. 구성 캐시 관리자, 다른 캐시, 다른 구성을 달성하기 위해, 당신은 ehcache.xml를 구성해야

예를 들면

코드를 복사
1 <? XML 버전 = "1.0"인코딩 = "UTF-8"?> 
 2 <으로 Ehcache> 
 3 <diskStore 경로 = "java.io.tmpdir을"/> 
 4 <! -配置默认的缓存区-> 
 5 <defaultCache 
 6 maxElementsInMemory = "10000" 
 7 영원한 = "FALSE" 
 8 timeToIdleSeconds = "120" 
 9 timeToLiveSeconds = "120" 
10 maxElementsOnDisk = "10000000" 
11 diskExpiryThreadIntervalSeconds = "120" 
12 memoryStoreEvictionPolicy = "LRU"/> 
13 <! - -配置名为사용자的缓存区-> 
14 <캐시 이름 = "사용자" 
15 maxElementsInMemory = "10000"
16 영원한 = "FALSE" 
17 overflowToDisk = "true"를 
18 timeToIdleSeconds = "300" 
19 timeToLiveSeconds = "600"/>
20 </으로 Ehcache>
코드를 복사

두 캐시로 구성된 상기 ehcache.xml는 콩의 스프링은, 얼마나 많은 버퍼가 정의 될으로 Ehcache 얼마나 많은 버퍼 영역, 일반적인 스프링 빈 용기에 캐시 될 것이다.

봄이 다음 CacheManager으로 Ehcache를 구성하는, 제 콩 콩 식물입니다 캐시 관리자는 다음 구성 파일, 배치, 두 번째는 캐시 관리자 콩 봄 캐시 구성을 위해, 그것은 빈은 첫번째 것 제 콩 주입.

코드를 복사
. (1) : <캐시 매니저 = "CacheManager"/ 캐시 - 주석 기반> 
 2 
 . 3 <-하세요 CacheManager의 EHCache는 구성 
 . 위치 configLocation로 지정된 4 ehcache.xml 파일 -> 
 . 5 <빈 ID = "ehCacheManager" 
 . 6 개 클래스 = "org.springframework.cache.ehcache.EhCacheManagerFactoryBean" 
 7 P 다음 configLocation = "CLASSPATH 다음 ehcache.xml". 
 "거짓은"공유 = /> 8 P. 
 9 <- EHCache는 구성을 기반 캐시 관리자.! 
10 및으로 Ehcache 캐시 관리자 CacheManager 주입 콩 -> 
. 11 <빈 ID = "CacheManager" 
(12)는 클래스 = "org.springframework.cache.ehcache.EhCacheCacheManager는" 
13 P이다 = CacheManager-REF "ehCacheManager"> 
> 14 </ 콩
코드를 복사

 

여기에 완전한 봄의 구성은,

코드를 복사
1 <? XML 버전 = "UTF-8"코딩 "1.0"?> 
 2 <콩의 xmlns = "http://www.springframework.org/schema/beans" 
 3 개에 xmlns :이 xsi = "HTTP : // WWW. w3.org/2001/XMLSchema-instance " 
 4 개의 xmlns : p ="http://www.springframework.org/schema/p " 
 5 개의 xmlns : 캐시 ="http://www.springframework.org/schema/cache " 
 6 개의 xmlns : 컨텍스트 = "http://www.springframework.org/schema/context" 
 7에서는 xsi :의 schemaLocation = "http://www.springframework.org/schema/beans 
 8 http://www.springframework.org/ 스키마 / 콩 / 봄 콩 - 4.0.xsd 
 9 http://www.springframework.org/schema/cache 
10 http://www.springframework.org/schema/cache/spring-cache-4.0.xsd 
11 HTTP : //www.springframework.조직 / 스키마 / 컨텍스트 
12 HTTP : //www.springframework.조직 / 스키마 / 환경 / 스프링 상황 4.0.xsd "> 
(13)
14 <컨텍스트 : 컴포넌트 스캔 
15 자료 패키지 = "com.service"/> 
16          
. 17 <캐시 : 캐시 피구 주석 관리자 = "CacheManager는"/> 
(18)는 
19 <- CacheManager의 EHCache는 구성.! 
20 configLocation 의해 지정된 - 파일의 ehcache.xml 위치> 
(21)는 <빈 ID는 = "ehCacheManager" 
22 클래스 = "org.springframework.cache.ehcache.EhCacheManagerFactoryBean"이다 
configLocation = "CLASSPATH : ehcache.xml"(23)가 P 인 
24 P : 공유는 거짓 "= "/> 
! 25 <- 기반으로 Ehcache 캐시 관리자 구성 
CacheManager 26은 EHCache는 캐시 매니저 빈에 주입 -> 
29 P :cacheManager-REF = "ehCacheManager"> 
30 </ 콩> 
27 <콩 ID = "cacheManager"
28 등급 = "org.springframework.cache.ehcache.EhCacheCacheManager"
31      
32 </ 콩>
코드를 복사

 

다음은 EHCache는 Spring 기반의 캐시 사용을 입증하는 예를 @Cacheable 것입니다. 클래스의 수정, 모든 메소드의 다음 클래스가 캐시 된 경우 수정을위한 @Cacheable 클래스 또는 방법.

클래스 레벨 캐시

예를 들어 다음과 같은 Bean 클래스,

코드를 복사
1 @Service ( "userService") 
 2 @Cacheable (값 = "사용자") 
 3 개 공용 클래스 UserServiceImpl 구현 UserService { 
 4 
 5 @Override 
 6 공공 사용자 getUsersByNameAndAge (문자열 이름, INT 세) { 
 7에서 System.out.println ( "正在执行getUsersByNameAndAge () ... "); 
 8 반환 새로운 사용자 (이름, 나이); 
 9} 
10 
11 @Override 
(12) 공공 사용자 getAnotherUser (문자열 이름, INT 세) { 
13에서 System.out.println ( "正在执行getAnotherUser () ..."); 
(14) 수익의 새로운 사용자 (이름, 나이); 
15} 
16}
코드를 복사

 

기반 캐시 클래스는, 모든 메소드는 캐시 한 후, 프로그램의 클래스 인스턴스를 호출, 클래스를 캐시합니다 어느 한 같은 매개 변수가 전달로, 봄이 실제로 방법을 수행하지 않을 방법을하지만, 직접 전달 된 매개 변수에서 캐시의 데이터를 찾을 수 있습니다!

예는 캐시 데이터를 이용하여 아래에 나타낸다

코드를 복사
공공 정적 무효 TEST2 1 () {. 
2 ClassPathXmlApplicationContext ApplicationContext에 새로운 새로운 CTX = (이하 "beans.xml 환경") 
. 3 UserService US ctx.getBean = (UserService.class "userService 그") 
. 4 us.getUsersByNameAndAge 사용자 U1 = ( "홍길동 ", 50), 
5 // 두번째 동일한 파라미터를 이용하여, userService 메소드를 호출 할 때, 실제 방법이 실행되지 않을 것이기 때문에, 
6 // 캐시에서 직접 스프링 파라미터 데이터를 찾는다 
7 유저 U2 = us.getAnotherUser ( "조 스미스", 50) 
.도 8에서 System.out.println (U1 U2 ==) 
. 9}
코드를 복사

 

출력,

1 getUsersByNameAndAge () .. 실행되는 
참 2

 

캐시 그래서 스프링 데이터를 직접 실제 파라미터로 이전 패스 변수와 동일하게되기 때문에, 작동하지 않는 () getAnotherUser 위에서 알 수있다.

필수 속성을 제외하고 위의 의견 @Cacheable Bean 클래스 값에 키 조건 ,, 속성은 클래스 기반 캐시 향후 3 개 봄 스토리지 정책을 설정하는 데 사용하지 않는 한, 봄의 기본이 있습니다 캐시 검색 결과 키로 입력 매개 변수의 방법.

물론, 우리는 또한, 핵심 전략을 수정하는 등의 첫 번째 인수에 따라 다른 표준과 봄에 따라 키 캐시의 결과에 대한 모습과 동일하도록 할 수 있습니다.

Bean 클래스를 다음과 같이 위의 수정,

코드를 복사
1 @Service ( "userService") 
2 @Cacheable (값 = "사용자"키 = "# 이름") 
3 개 공용 클래스 UserServiceImpl 구현 UserService { 
4 
5 @Override 
6 공공 사용자 getUsersByNameAndAge (문자열 이름, INT 세) {
코드를 복사

 

수단은 우리가 같은 이름을 전달하는 것이, 봄은 정말 방법을 수행하지 않습니다. 오직 방법은 정말 다음과 같은 수행하는 다른 이름,

코드를 복사
공공 정적 무효 TEST2 1 () {. 
2 ClassPathXmlApplicationContext ApplicationContext에 새로운 새로운 CTX = (이하 "beans.xml 환경") 
. 3 UserService US ctx.getBean = (UserService.class "userService 그") 
. 4 us.getUsersByNameAndAge 사용자 U1 = ( "홍길동 ", 50), 
키 = 5 // @Cacheable 키 파라미터"# 이름 "후에는, 다음의 방법이 수행 될 수있다. 
6 유저 U2 = us.getAnotherUser ( "홍길동", 50) 
.도 7에서 System.out.println (U1 U2 ==) 
. 8}
코드를 복사

 

당신은 방법이 구현되는 ()이 시간 getAnotherUser를 참조 할 수 있습니다

1 getUsersByNameAndAge 실행되고 () ... 
2 getAnotherUser () ... 수행 
거짓. (3)

 

우리는 또한, 예를 들어, 조건 속성을 설정할 수 있습니다

코드를 복사
1 @Service ( "userService") 
2 @Cacheable (값 = "사용자", 조건 = "# 시대 <100") 
3 개 공용 클래스 UserServiceImpl 구현 UserService { 
4 
5 @Override 
6 공공 사용자 getUsersByNameAndAge (문자열 이름, INT 세) {
코드를 복사

 

그래서, 다음 코드는 두 가지 방법은 캐시되지 않습니다, 봄이 결과를 취할 때마다 실제 방법을 실행,

코드를 복사
1 공용 정적 무효 TEST2 () { 
2의 ApplicationContext CTX = 새로운 ClassPathXmlApplicationContext ( "beans.xml 환경"); 
3 UserService 우리 = ctx.getBean ( "userService", UserService.class); 
4 사용자 U1 = us.getUsersByNameAndAge ( "张三', 500); 
5 유저 U2 = us.getAnotherUser ( "李四', 500); 
도 6에서 System.out.println (U1, U2 ==); 
7}
코드를 복사

 

그 결과,

1 getUsersByNameAndAge 실행되고 () ... 
2 getAnotherUser () ... 수행 
거짓. (3)

방법 레벨 캐시

방법 - 레벨 캐싱 메소드는 일, 다른 방법은 당신이 그런만큼 다음, 사용되지 않은 버퍼를 설정할 수 있습니다 것입니다

코드를 복사
1 @Service ( "userService") 
 이 개 공용 클래스 UserServiceImpl 구현 UserService { 
 3 
 4 @Cacheable ( "사용자 1") 
 5 @Override 
 6 공공 사용자 getUsersByNameAndAge (문자열 이름, INT 세) { 
 7에서 System.out.println ( "正在执行getUsersByNameAndAge () ... "); 
 8 반환 새로운 사용자 (이름, 나이); 
 9} 
10 
11 @Cacheable ( "users2") 
12 @Override 
(13) 공공 사용자 getAnotherUser (문자열 이름, INT 세) { 
14에서 System.out.println ( "正在执行getAnotherUser () ..."); 
15 리턴 새로운 사용자 (이름, 나이); 
16} 
17}
코드를 복사

 

다음 테스트 코드를 사용하여

코드를 복사
공공 정적 무효 TEST2 1 () {. 
 2 ClassPathXmlApplicationContext ApplicationContext에 새로운 새로운 CTX = (이하 "beans.xml 환경") 
 . 3 UserService US ctx.getBean = ( "라는 userService"UserService.class) 
 . 처음 방법을 수행하도록 4 // 메소드 정말 수행하고 캐시됩니다 
 5 사용자 U1 = us.getUsersByNameAndAge ( "조 스미스", 500); 
 (6) // 같은 매개 변수를 전달하는 다음의 방법이 있지만, 다른 캐시에이 두 가지 방법이 있기 때문에, 캐시 데이터를 사용할 수는 없지만 
 (7) 사용자 U2 = us.getAnotherUser ( "조 스미스", 500) 
 . 8에서 System.out.println (U1 U2 ==) 
 . 9 // 이미 캐시로서, 정말 직접 캐시 사용이 수행되지 않습니다 
10 사용자 U3를 = 우리 .getAnotherUser ( "조 스미스"(500)) 
. (11)에서 System.out.println (==는 U2 U3), 
12} 인
코드를 복사

그 결과,

1 getUsersByNameAndAge 실행되고 () ... 
2 getAnotherUser을 수행하고 () ... 
. 3 거짓 
. 4 참

사용 @CacheEvict 캐시 지우기

수정 방법은 다음과 같은 속성을 지정할 수 있습니다 @CacheEvict를 사용하여 캐시 @CacheEvict을 취소 할 수 있습니다.

allEntries는 여부는 전체 캐시를 지우려면

beforeInvocation : 실행 방법 전에 캐시를 삭제할지 여부를 지정합니다. 기본 방법은 성공적으로 실행 후 삭제됩니다.

condiition와 키를 @Cacheable 같은 의미.

아와 다음의 간단한 모델,

코드를 복사
1 @Service ( "userService") 
 2 @Cacheable ( "사용자") 
 3 개 공용 클래스 UserServiceImpl 구현 UserService { 
 4 
 5 @Override 
 6 공공 사용자 getUsersByNameAndAge (문자열 이름, INT 세) { 
 7에서 System.out.println ( "正在执行getUsersByNameAndAge () ... "); 
 8 반환 새로운 사용자 (이름, 나이); 
 9} 
10 
11 @Override 
(12) 공공 사용자 getAnotherUser (문자열 이름, INT 세) { 
13에서 System.out.println ( "正在执行getAnotherUser () ..."); 
(14) 수익의 새로운 사용자 (이름, 나이); 
15} 
参数清楚缓存//指定根据16 명, 연령 
17 @CacheEvict (값 = "사용자") 
(18) 공개 무효 evictUser (문자열 이름, 나이 INT) { 
. 19에서 System.out.println ("- 비우는 "+ 이름 + ","+ 나이 +"캐시 해당 - ");
20} 
21은      
22 // 지정된 퍼지 모든 사용자 데이터가 버퍼 캐시 
(23) (값 = TRUE allEntries에 "사용자"=) @CacheEvict 인 
24 evictAll 공개 무효 () { 
전체 캐시를 비우는 - 25에서 System.out.println는 ( " - "); 
26} 
27}
코드를 복사

 

다음은 테스트 클래스는,

코드를 복사
공공 정적 무효 TEST2 1 () {. 
 2 ClassPathXmlApplicationContext ApplicationContext에 새로운 새로운 CTX = (이하 "beans.xml 환경"); 
 . 3 UserService 미국 ctx.getBean = (UserService.class "userService 그"); 
 두 개의 캐시 시스템 방법 4 // 
 5 사용자 U1 = us.getUsersByNameAndAge ( "조 스미스", 500) 
 . 6 us.getAnotherUser 사용자 U2 = ( "홍길동", 400), 
 특정 버퍼의 데이터를 클리어 7 // 호 evictUser () 메소드 
 8 us.evictUser를 ( " 신원 미상; ", 400) 
 9 // 명확 전면 신원 미상, 캐시 (400)는, 방법은 다음과 같은 데이터를 다시 캐시됩니다 반환 
; 홍길동", 400) 10 사용자 U3 = us.getAnotherUser ( " 
. 11 시스템. Out.println (US == U3); // false로 
(12)는 이미 캐시에 데이터 (500)는, 다음과 같은 방법을 재실행하지 않습니다 // 조 스미스 데이터에 직접 액세스 캐시됩니다 
"(13 사용자 U4 = us.getAnotherUser조 스미스 ", 500);
14에서 System.out.println (U1 == U4) // 참 출력 // true로 출력 
(15) // 전체 캐시를 지우
16 us.evictAll () 
. 17 // 전체 캐시가 삭제 되었기 때문에, 다음 코드가 다시 실행된다 
(18) 사용자 U5 = us.getAnotherUser ( "조 스미스", 500) 
. 19 us.getAnotherUser 사용자 U6 = ( "홍길동", 400), 
(20)에서 System.out.println된다 (U1 == U5); // false로 출력 
21에서 System.out.println (U3 =이고 = U6); false로 출력 // 
22} 인
코드를 복사

 

그 결과,

코드를 복사
1 .. getUsersByNameAndAge ()를 실행되는 
 2 getAnotherUser을 수행하고 () ... 
 (3) -. 캐시 대응 홍길동 400 비우는 - 
 4 및 getAnotherUser () ... 실행 
 . 거짓 5 
 . 6 true로 
 . 7 - 전체 캐시 비우기 - - 
 . 8 getAnotherUser 실행되고 () ... 
 9 getAnotherUser () ... 행한다. 
거짓 10 
거짓 11.
코드를 복사

추천

출처www.cnblogs.com/weizhxa/p/12066043.html