Spring 코 디 EHcache 인 스 턴 스 분석

14111 단어 SpringEhcache
1 Ehcache 소개
EhCache 는 순수 자바 프로 세 스 내 캐 시 프레임 워 크 로 빠 르 고 세련 된 특징 을 가지 고 있 으 며 Hibernate 의 기본 CacheProvider 입 니 다.
Ehcache 는 광범 위 하 게 사용 되 는 오픈 소스 자바 분산 캐 시 입 니 다.주로 유 니 버 설 캐 시,자바 EE,경량급 용 기 를 대상 으로 합 니 다.메모리 와 디스크 저장,캐 시 캐리어,캐 시 확장,캐 시 이상 처리 프로그램,gzip 캐 시 servlet 필터,REST 와 SOAP api 지원 등 특징 이 있 습 니 다.
EHcache 는 당초 Greg Luck 이 2003 년 개발 을 시작 했다.2009 년 에 이 프로젝트 는 Terracotta 에 의 해 구 매 되 었 다.소프트웨어 는 여전히 오픈 소스 이지 만 일부 새로운 주요 기능(예 를 들 어 빠 른 재 부팅 가능 성 간 의 일치 성)은 상업 제품 에서 만 사용 할 수 있다.예 를 들 어 Enterprise EHcache and BigMemory.위 키 미디어 Foundation announced 는 현재 Ehcache 기술 을 사용 하고 있다.
아무튼 Ehcache 는 좋 은 캐 시 기술 입 니 다.Spring 과 Ehcache 가 어떻게 실현 되 는 지 살 펴 보 겠 습 니 다.
2 스프링 코 디
시스템 결 과 는 다음 과 같 습 니 다.

3.구체 적 인 설정 소개
이 몇 부분의 결합 이 있다.
src:자바 코드,차단기,호출 인터페이스,테스트 클래스 포함
src/cache-bean.xml:EHcache,차단기,테스트 클래스 등 정보 에 대응 하 는 bean 설정
src/ehcache.xml:EHcache 캐 시 설정 정보
WebRoot/lib:라 이브 러 리
4 상세 내용 소개
4.1 src
4.1.1 차단기
코드 에 먼저 두 개의 차단기 가 설정 되 어 있 습 니 다.
첫 번 째 차단 기 는:
com.test.ehcache.CacheMethodInterceptor
내용 은 다음 과 같다.

package com.test.ehcache;

import java.io.Serializable;

import net.sf.ehcache.Cache;
import net.sf.ehcache.Element;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.util.Assert;

public class CacheMethodInterceptor implements MethodInterceptor,
 InitializingBean {

 private Cache cache;

 public void setCache(Cache cache) {
 this.cache = cache;
 }

 public CacheMethodInterceptor() {
 super();
 }

 /**
 *   ServiceManager   ,          ,       cache   ,
 *   ,         ,        cache
 */
 public Object invoke(MethodInvocation invocation) throws Throwable {
 //       
 String targetName = invocation.getThis().getClass().getName();
 //          
 String methodName = invocation.getMethod().getName();
 //             
 Object[] arguments = invocation.getArguments();
 Object result;

 //       ,   cache  key
 String cacheKey = getCacheKey(targetName, methodName, arguments);
 // cache     
 Element element = cache.get(cacheKey);

 if (element == null) {
 //  cache     ,      ,     ,        cache

  result = invocation.proceed();
  //     cache key value
  element = new Element(cacheKey, (Serializable) result);
  System.out.println("-----        ,         ,       ");
  // key value  cache
  cache.put(element);
 } else {
 //  cache    ,   cache

  System.out.println("-----       ,      ,         ");
 }
 return element.getValue();
 }

 /**
 *   cache key   ,cache key Cache   Element     ,
 *     +  +   , :com.test.service.TestServiceImpl.getObject
 */
 private String getCacheKey(String targetName, String methodName,
  Object[] arguments) {
 StringBuffer sb = new StringBuffer();
 sb.append(targetName).append(".").append(methodName);
 if ((arguments != null) && (arguments.length != 0)) {
  for (int i = 0; i < arguments.length; i++) {
  sb.append(".").append(arguments[i]);
  }
 }
 return sb.toString();
 }

 /**
 * implement InitializingBean,  cache     70
 */
 public void afterPropertiesSet() throws Exception {
 Assert.notNull(cache,
  "Need a cache. Please use setCache(Cache) create it.");
 }

}

CacheMethodInterceptor 는"get"으로 시작 하 는 방법 을 차단 하 는 데 사 용 됩 니 다.이 차단 기 는 먼저 차단 한 다음 에 원래 호출 인 터 페 이 스 를 실행 하 는 것 입 니 다.
또 하나의 차단기 가 있다.
com.test.ehcache.CacheAfterReturningAdvice
구체 적 인 내용:

package com.test.ehcache;

import java.lang.reflect.Method;
import java.util.List;

import net.sf.ehcache.Cache;

import org.springframework.aop.AfterReturningAdvice;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.util.Assert;

public class CacheAfterReturningAdvice implements AfterReturningAdvice,
 InitializingBean {

 private Cache cache;

 public void setCache(Cache cache) {
 this.cache = cache;
 }

 public CacheAfterReturningAdvice() {
 super();
 }

 public void afterReturning(Object arg0, Method arg1, Object[] arg2,
  Object arg3) throws Throwable {
 String className = arg3.getClass().getName();
 List list = cache.getKeys();
 for (int i = 0; i < list.size(); i++) {
  String cacheKey = String.valueOf(list.get(i));
  if (cacheKey.startsWith(className)) {
  cache.remove(cacheKey);
  System.out.println("-----    ");
  }
 }
 }

 public void afterPropertiesSet() throws Exception {
 Assert.notNull(cache,
  "Need a cache. Please use setCache(Cache) create it.");
 }

}

CacheAfter Returning Advice 는"update"로 시작 하 는 방법 을 차단 하 는 데 사 용 됩 니 다.이 차단 기 는 원래 호출 인 터 페 이 스 를 먼저 실행 한 후에 차단 되 는 것 입 니 다.
4.1.2 호출 인터페이스
인터페이스 이름:
com.test.service.ServiceManager
구체 적 인 내용 은 다음 과 같다.

package com.test.service;

import java.util.List;

public interface ServiceManager { 
 public List getObject(); 

 public void updateObject(Object Object); 
}

구현 클래스 이름:
com.test.service.ServiceManagerImpl
구체 적 인 내용 은 다음 과 같다.

package com.test.service;

import java.util.ArrayList;
import java.util.List;

public class ServiceManagerImpl implements ServiceManager {

 @Override
 public List getObject() {
 System.out.println("-----ServiceManager:  Cache     element,     ,   Cache!");

 return null;
 }

 @Override
 public void updateObject(Object Object) {
 System.out.println("-----ServiceManager:     ,      cache   remove!");
 }

}

4.1.3 테스트 클래스
테스트 클래스 이름:
com.test.service.TestMain
구체 적 인 내용 은:

package com.test.service;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestMain {

 public static void main(String[] args) {

 String cacheString = "/cache-bean.xml";
 ApplicationContext context = new ClassPathXmlApplicationContext(
  cacheString);
 //      proxyFactory   bean,        
 ServiceManager testService = (ServiceManager) context.getBean("proxyFactory");

 //      
 System.out.println("=====     ");
 testService.getObject();

 //      
 System.out.println("=====     ");
 testService.getObject();

 //   update  (      )
 System.out.println("=====     ");
 testService.updateObject(null);

 //      
 System.out.println("=====     ");
 testService.getObject();
 } 
}

bean 을 얻 는 것 은 대리 공장 proxy Factory 를 통 해 생산 되 는 bean 입 니 다.그래 야 차단 효과 가 있 습 니 다.
테스트 클래스 에 네 번 의 호출 을 설정 한 것 을 알 수 있 습 니 다.실행 순 서 는 다음 과 같 습 니 다.
첫 번 째 찾기
두 번 째 찾기
첫 업데이트
세 번 째 찾기
4.2 src/cache-bean.xml
cache-bean.xml 는 Ehcache,차단기,테스트 클래스 등 정보 에 대응 하 는 bean 을 설정 하 는데 사용 되 며 내용 은 다음 과 같 습 니 다.

<?xml version="1.0" encoding="UTF-8"?> 
 <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" 
"http://www.springframework.org/dtd/spring-beans.dtd"> 
<beans> 
 <!--   ehCache    --> 
 <bean id="defaultCacheManager" 
 class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"> 
 <property name="configLocation"> 
  <value>ehcache.xml</value> 
 </property>
 </bean> 

 <!--   ehCache   ,       Cache name, “com.tt” --> 
 <bean id="ehCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean"> 
 <property name="cacheManager"> 
  <ref local="defaultCacheManager" /> 
 </property>
 <!-- Cache    -->
 <property name="cacheName"> 
  <value>com.tt</value> 
 </property> 
 </bean> 

 <!--     、         --> 
 <bean id="cacheMethodInterceptor" class="com.test.ehcache.CacheMethodInterceptor"> 
 <property name="cache"> 
  <ref local="ehCache" /> 
 </property> 
 </bean>

 <!--     、         --> 
 <bean id="cacheAfterReturningAdvice" class="com.test.ehcache.CacheAfterReturningAdvice"> 
 <property name="cache"> 
  <ref local="ehCache" /> 
 </property> 
 </bean>

 <!--     ,       -->
 <bean id="serviceManager" class="com.test.service.ServiceManagerImpl" /> 

 <!--      ,         ,            ,       com.test.ehcache.CacheMethodInterceptor -->
 <bean id="cachePointCut" 
 class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"> 
 <!--     ,       print   ,         -->
 <property name="advice"> 
  <ref local="cacheMethodInterceptor" /> 
 </property> 
 <property name="patterns"> 
  <list> 
  <!-- 
   ### .             
   ### +                 
   ### *                 
   ### \Escape  Regular expression         
  -->   
  <!-- .*       (    ),     getObject  -->
  <value>.*get.*</value> 
  </list> 
 </property> 
 </bean> 

 <!--      ,         ,            ,       com.test.ehcache.CacheAfterReturningAdvice -->
 <bean id="cachePointCutAdvice" 
 class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"> 
 <property name="advice"> 
  <ref local="cacheAfterReturningAdvice" /> 
 </property> 
 <property name="patterns"> 
  <list>
  <!-- .*       (    ),   updateObject  --> 
  <value>.*update.*</value> 
  </list> 
 </property> 
 </bean>

 <!--      -->
 <bean id="proxyFactory" class="org.springframework.aop.framework.ProxyFactoryBean">
 <!--       bean   -->
 <property name="target"> 
  <ref local="serviceManager" /> 
 </property> 
 <!--      bean   -->
 <property name="interceptorNames"> 
  <list> 
  <value>cachePointCut</value> 
  <value>cachePointCutAdvice</value> 
  </list> 
 </property> 
 </bean> 
</beans>

각 bean 의 내용 에 대해 주석 설명 을 했 는데 주의해 야 할 것 은 대리 공장 bean 을 잊 지 마 세 요.
4.3 src/ehcache.xml
ehcache.xml 에 Ehcache 캐 시 설정 에 대한 자세 한 정 보 를 저장 합 니 다.내용 은 다음 과 같 습 니 다.

<?xml version="1.0" encoding="UTF-8"?> 
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">
 <!--        -->
 <diskStore path="D:\\temp\\cache" /> 

 <defaultCache maxElementsInMemory="1000" eternal="false" 
 timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true" /> 
 <!--         ,  “com.tt”         --> 
 <cache name="com.tt" maxElementsInMemory="10000" eternal="false" 
 timeToIdleSeconds="300000" timeToLiveSeconds="600000" overflowToDisk="true" /> 
</ehcache>

캐 시 를 볼 수 있 는 저장 소 위 치 는"D:\temp\cache"로 설정 되 어 있 으 며 캐 시 이름 은"com.tt"로 설정 되 어 있 습 니 다.그림 참조:

4.4 WebRoot/lib
필요 한 자바 라 이브 러 리 는 시작 하 는 시스템 구조 그림 을 참조 하 십시오.
5 테스트
테스트 클래스 를 실행 합 니 다.테스트 결 과 는 다음 과 같 습 니 다.

집행 결 과 를 통 해 우 리 는 다음 과 같은 것 을 알 수 있다.
첫 번 째 검색 이 차 단 된 후 처음 차단 되 었 고 캐 시 캐 시 캐 시가 없 는 것 을 발 견 했 습 니 다.따라서 기 존 인터페이스 류 를 실행 하고 조회 할 데 이 터 를 얻 으 면 데이터 베 이 스 를 통 해 조회 한 다음 에 Cache 를 생 성하 고 조회 한 데 이 터 를 Cache 에 넣 을 수 있 습 니 다.
두 번 째 검색 이 차단 되 었 을 때 Cache 가 존재 한 다 는 것 을 알 게 되 었 습 니 다.그래서 기 존의 인터페이스 류 를 실행 하지 않 습 니 다.즉,데이터 베 이 스 를 조회 하지 않 고 Cache 를 통 해 데 이 터 를 조회 하 는 것 입 니 다.물론 여 기 는 간단하게 인쇄 할 뿐 입 니 다.
그 다음 에 첫 번 째 업 데 이 트 였 습 니 다.차단 되 었 을 때 하 는 작업 은 Cache 의 데 이 터 를 모두 데이터베이스 에 저장 하고 Cache 를 삭제 하 는 것 입 니 다.
마지막 으로 세 번 째 조회 입 니 다.차단 되 었 다가 시스템 에 Cache 가 존재 하지 않 는 다 는 것 을 알 게 되 었 습 니 다.그래서 원 인터페이스 류 조회 데이터 베 이 스 를 실행 하여 Cache 를 만 들 고 새로 조회 한 데 이 터 를 Cache 에 넣 었 습 니 다.첫 번 째 조회 방식 과 같다.
이로써 우 리 는 Spring 코 디 Ehcache 에 필요 한 작업 을 실현 했다.
6 첨부 소스 코드
첨부 소스 코드 는 제github사이트 에서 얻 을 수 있 습 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기