Spring의 캐싱 메커니즘은 매우 유연하며 컨테이너의 콩 또는 콩 방법을 캐시 할 수 있습니다. 따라서,이 캐싱 메커니즘은 모든 수준의 Javaee 응용 프로그램에서 캐싱 될 수 있습니다.
스프링 캐시의 기본 레이어도 Ehcache (Hibernate Cache Tool)와 같은 다른 캐시 도구의 도움으로 구현해야하며 상단 계층은 통합 API 프로그래밍을 사용합니다.
스프링 캐시를 사용하려면 다음 세 단계가 필요합니다.
예를 들어
<? xml version = "1.0"alcoding = "utf-8"?> <ehcache> <diskstore path = "java.io.tmpdir" /> <!-기본 캐시를 구성-> <defaultCache maxelementsInmemory = "10000"Eternal = "False"TimetoidleSeconds = "120"120 "Timetoliveseconds ="120 " maxelementsondisk = "100000000"diskexpirythreadintervalseconds = "120"MemoryStoreEvictionPolicy = "lru"/> <!-이름이 명명 된 캐시를 구성합니다-> <cache name = "users"maxelementsInmemory = "10000"false "OverFlowTodisk ="true "timetoidseconds ="300 ""timetolivestOdeconds. /> < /ehcache>
위의 ehcache.xml 두 개의 캐시 영역을 구성합니다. 봄의 콩은이 캐시 영역에 캐시됩니다. 일반적으로 스프링 컨테이너에 콩 수는 ehcache로 정의됩니다.
그런 다음 스프링 구성 파일의 캐시 관리자를 다음과 같이 구성합니다. 여기서 첫 번째 Bean은 Ehcache의 캐시 메너를 구성하는 데 사용되는 공장 Bean이며, 두 번째 Bean은 스프링 캐시에 대해 구성된 캐시 관리자이므로 첫 번째 Bean이 두 번째 Bean에 주입됩니다.
<캐시 : 주석 중심의 캐시-매너 = "Cachemanager" /> <!-configlocation을 통해 ehcache.xml 파일의 위치를 지정하도록 ehcache cachemanager를 구성합니다-> <bean id = "ehcachemanager"p : configlocation = "classpath : ehcache.xml"p : shared = "false" /> canter " /> eh. ehcache cachemanager를 캐시 관리자 Bean에 주입합니다-> <bean id = "Cachemanager"p : Cachemanager-Ref = "ehcachemanager"> </bean>
다음은 완전한 스프링 구성입니다.
<? xml 버전 = "1.0"alcoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans"xmlns : xsi = "http://ww.w.w3.org/2001/xmlschema-instance" xmlns : p = "http://www.springframework.org/schema/p"xmlns : cache = "http://www.springframework.org/schema/cache"xmlns : 컨텍스트 = "http://www.springfrfamwork.org/schema/context" xsi : schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/sprring-conxt-4.0.0.xsd " <context : component-scan base-package = "com.service" /> <캐시 : 주석 중심의 캐시-매너 = "Cachemanager" /> <!-구성 cachemanager 구성 ehcache.xml 파일의 위치를 지정하십시오-> <bean id = "ehcachemanager"p : ehcache.cemanager " P : Shared = "False"/> <!-Ehcache 기반 캐시 관리자를 구성하고 Ehcache의 캐시 메너를 캐시 관리자 Bean에 주입합니다 .-> <bean id = "Cachemanager"P : Cachemanager-Ref = "ehcachemanager"> </bean> </beans>
다음은 @Cacheable 예제로 사용하여 Ehcache 캐시를 기반으로 스프링 사용을 보여줍니다. Cacheable 클래스 또는 방법을 수정하는 데 사용됩니다. 클래스가 수정되면 클래스의 모든 메소드가 캐시됩니다.
클래스 수준 캐시
예를 들어 다음과 같은 콩 클래스가 있습니다.
@Service ( "userVice") @cachable (value = "user") public class userviceimpl userservice {@override public user getUsersBynameAndage (문자열 이름, int age) {system.out.println ( "getUsersbyNameAndage () ..."); 새 사용자를 반환합니다 (이름, 나이); } @override public user getAnotherUser (문자열 이름, int age) {system.out.println ( "getAnotherUser () ..."); 새 사용자를 반환합니다 (이름, 나이); }}클래스 기반 캐시는 클래스의 모든 메소드를 캐시합니다. 캐시 후 프로그램은이 클래스 인스턴스의 모든 메소드를 호출합니다. 전달 된 매개 변수가 동일하다면 스프링은 실제로 메소드를 실행하지 않지만 전달 된 매개 변수를 기반으로 캐시 된 데이터를 직접 검색합니다!
예를 들어 아래와 같이 캐시 된 데이터를 사용하십시오.
public static void test2 () {ApplicationContext ctx = new ClassPathXmlApplicationContext ( "beans.xml"); UserserVice us = ctx.getBean ( "userService", userservice.class); 사용자 U1 = US.GetUsersByNameAndage ( "Zhang San", 50); // userService 메소드가 두 번째로 불리는 경우 동일한 매개 변수가 사용되므로 실제 메소드는 실행되지 않으며 // Spring은 캐시 사용자 U2 = US.getAnotherUser ( "Zhang San", 50)의 매개 변수별로 데이터를 직접 검색합니다. System.out.println (u1 == u2); }출력 결과,
getUsersByNameAndage ()가 실행 중입니다.
진실
보시다시피, 위의 GetAnotherUser ()는 실제로 전달 된 매개 변수가 이전 방법에 의해 전달 된 매개 변수와 동일하기 때문에 실제로 실행되지 않으므로 스프링은 캐시 영역 데이터에서 직접 나옵니다.
필수 속성 값 외에도 위의 Bean 클래스에서 @Cacheable 는 키, 조건 및 속성이없는 경우도 있습니다. 마지막 3 개는 스프링 저장 정책을 설정하는 데 사용됩니다. 클래스 기반 캐시의 경우 Spring은 메소드에 전달 된 매개 변수를 기본적으로 캐시에서 결과를 검색하기 위해 키로 사용합니다.
물론, 우리는 키의 전략을 수정하고 첫 번째 매개 변수가 키와 동일한 지 여부와 같은 다른 표준을 따르고 캐시의 결과를 찾아 볼 수 있습니다.
위의 Bean 클래스를 다음과 같이 수정하십시오.
@Service ( "userVice") @cachable (value = "user", key = "#name") public class userserviceimpl emerservice {@override public user getUsersBynameAndage (문자열 이름, int age) {우리가 같은 이름으로 전달한다는 것을 의미하면, Spring은 실제로 메소드를 실행하지 않습니다. 이름이 다른 경우에만 메소드가 실행됩니다.
public static void test2 () {ApplicationContext ctx = new ClassPathXmlApplicationContext ( "beans.xml"); UserserVice us = ctx.getBean ( "userService", userservice.class); 사용자 U1 = US.GetUsersByNameAndage ( "Zhang San", 50); // @Cachable의 키 매개 변수를 key = "#name"으로 변경 한 후 다음 메소드를 실행할 수 있습니다. 사용자 U2 = US.GetAnotheruser ( "Li Si", 50); System.out.println (u1 == u2); } 이번에는 getAnotherUser() 메소드가 실행되었음을 알 수 있습니다.
1 GetUsersByNameAndage ()가 실행 중입니다.
2 getAnotheruser ()가 실행 중입니다 ..
3 거짓
예를 들어 조건 속성을 설정할 수도 있습니다.
@Service ( "userVice") @cachable (value = "user", condition = "#age <100") public class userserviceimpl emerservice {@override public user getUsersBynameAndage (문자열 이름, int age) {따라서 다음 코드의 경우 어느 방법도 캐시되지 않습니다. Spring은 매번 결과를 얻기 위해 실제 방법을 실행합니다.
public static void test2 () {ApplicationContext ctx = new ClassPathXmlApplicationContext ( "beans.xml"); UserserVice us = ctx.getBean ( "userService", userservice.class); 사용자 U1 = US.GetUsersByNameAndage ( "Zhang San", 500); User U2 = Us.getAnotheruser ( "Li Si", 500); System.out.println (u1 == u2); }실행 결과,
getUsersByNameAndage ()가 실행 중입니다.
getanotheruser ()가 실행 중입니다 ..
거짓
메소드 수준 캐시는 메소드에만 작동합니다. 다른 방법은 다음과 같은 불필요한 캐시 영역을 설정할 수 있습니다.
@Service ( "userService") public class userviceimpl은 userErvice {@cachable ( "users1") @override public user getUsersBynameAndage (문자열 이름, int age) {system.out.println ( "execution getUsersByNameAndage ()); 새 사용자를 반환합니다 (이름, 나이); } @Cachable ( "Users2") @override public user getanotheruser (문자열 이름, int age) {system.out.println ( "getanotheruser () .."); 새 사용자를 반환합니다 (이름, 나이); }}다음 테스트 코드를 사용하십시오.
public static void test2 () {ApplicationContext ctx = new ClassPathXmlApplicationContext ( "beans.xml"); UserserVice us = ctx.getBean ( "userService", userservice.class); // 메소드가 처음 실행되면 메소드가 실행되고 사용자 U1 = Us.GetUsersByNameAndage ( "Zhang San", 500); // 다음 방법은 동일한 매개 변수를 전달하지만이 두 방법은 다른 캐시 영역에 있기 때문에 캐시 데이터를 사용할 수 없습니다. User U2 = Us.getAnotheruser ( "Zhang San", 500); System.out.println (u1 == u2); // 위는 캐시되었으며 여기에서 실행되지 않습니다. 캐시를 직접 사용하십시오. User U3 = Us.getAnotheruser ( "Zhang San", 500); System.out.println (u3 == U2); }실행 결과,
getUsersByNameAndage ()가 실행 중입니다.
getanotheruser ()가 실행 중입니다 ..
거짓
진실
@CacheEvict에 의해 수정 된 방법은 캐시를 지우는 데 사용될 수 있으며 다음 속성은 @CacheEvict 사용하여 지정할 수 있습니다.
전체 캐시 영역을 지울지 여부에 관계없이 Allentries
전보자 전 : 메소드를 실행하기 전에 캐시를 지울지 여부. 기본값은 메소드가 성공적으로 실행 된 후에 만 지우는 것입니다.
조건 및 키, @Cacheable 과 같은 의미.
다음 데모는 간단합니다.
@Service ( "userService")@Cachable ( "사용자") 공개 클래스 userErviceimpl은 userService {@override public user getUsersBynameAndage (string name, int age) {system.out.println ( "getUsersbyNameAndage ()); Reture Public User (stride getanother get) {system.out.println ( "getAnotheruser () .."); 새 사용자 (이름, 나이);} // 이름과 연령 매개 변수 @cacheevict (value = "users")에 따라 명확한 캐시를 지정합니다 @cacheevict (value = "user") public void evictuser (문자열 이름, int age.out.println (system.out.println); 사용자 캐시 영역에서 모든 캐시 된 데이터를 지우기 @cacheevict (value = "user", allentries = true) public void evictall () {System.out.println ( "-전체 캐시 청소-");}}아래는 테스트 클래스이며
public static void test2 () {ApplicationContext ctx = new ClassPathXmlApplicationContext ( "beans.xml"); UserserVice us = ctx.getBean ( "userService", userservice.class); // 시스템은 두 가지 메소드 사용자 U1 = US.GetUsersByNameAndage ( "Zhang San", 500)를 캐시합니다. User U2 = Us.getAnotheruser ( "Li Si", 400); // 버퍼에 지정된 데이터를 지우려면 evictuser () 메소드를 호출합니다. // 다음 방법에 의해 반환 된 데이터가 다시 캐시되기 전에 li si, 400을 지우십시오. user u3 = us.getanotheruser ( "li si", 400); System.out.println (us == U3); // 거짓 // Zhang San과 500의 데이터는 이전에 캐시되었으며 다음 방법은 다시 실행되지 않으며 캐시의 데이터는 사용자 U4 = US.getAnotherUser ( "Zhang San", 500)로 직접 검색됩니다. System.out.println (u1 == u4); // ortput true // 전체 캐시를 지우십시오. us.evictall (); // 전체 캐시가 지워 졌기 때문에 다음 코드는 사용자 U5 = US.GetAnotherUser ( "Zhang San", 500)를 다시 실행합니다. User U6 = Us.getAnotheruser ( "li si", 400); System.out.println (u1 == u5); // output false system.out.println (u3 == u6); // false output}실행 결과,
getUsersByNameAndage ()가 실행 중입니다.
getanotheruser ()가 실행 중입니다 ..
-Li Si, 400-에 해당하는 캐시를 청소
getanotheruser ()가 실행 중입니다 ..
거짓
진실
-전체 캐시를 기르기
getanotheruser ()가 실행 중입니다 ..
getanotheruser ()가 실행 중입니다 ..
거짓
거짓
위의 것은이 기사의 스프링 캐싱 메커니즘 예제 코드에 관한 모든 것이며, 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구는이 사이트의 다른 관련 주제를 계속 참조 할 수 있습니다. 단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다!