Spring 코 디 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사이트 에서 얻 을 수 있 습 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[MeU] Hashtag 기능 개발➡️ 기존 Tag 테이블에 존재하지 않는 해시태그라면 Tag , tagPostMapping 테이블에 모두 추가 ➡️ 기존에 존재하는 해시태그라면, tagPostMapping 테이블에만 추가 이후에 개발할 태그 기반 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.