봄 캐싱 메커니즘은 매우 유연하고이 캐싱 메커니즘은 모든 수준의 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.