スプリング・キャッシング機構は、非常に柔軟であり、このキャッシング機構は、任意のレベルのJavaEEアプリケーションでキャッシュできるように、任意の容器又はビーンBeanメソッドにキャッシュすることができます。
春の基礎となるキャッシュは、このようにehcache(Hibernateのキャッシュツール)を達成するために、他のツールの助けを必要とし、トップの場所の統一APIプログラミングをバッファリングします。
春のキャッシュを使用するには、3つの手順を以下の
- 名前空間:Spring構成ファイルには1.インポートコンテキスト
- 2.春のプロファイルキャッシュは、特に、有効になっている追加<キャッシュ:注釈駆動型キャッシュマネージャ=「キャッシュ・マネージャID」/>
- それはEhcacheのある場合の構成3.キャッシュマネージャー、異なるキャッシュは、異なる構成を実現するために、あなたはehcache.xmlを設定する必要があります
例えば
1の<?xml version = "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を>
2つのキャッシュで構成された上記ehcache.xmlは、豆春は、どのように多くのバッファがehcacheをで定義されますどのように多くのバッファ領域、一般的な、春豆の容器内にキャッシュされます。
スプリングは、その後のCacheManager EHCacheなどを設定するために、最初の豆豆植物であるキャッシュマネージャは以下の構成ファイル内に配置され、第二は、キャッシュマネージャ豆スプリングのキャッシュ構成のために、それは豆最初意志二ビーンを注入します。
1 <キャッシュ:キャッシュ-従動注釈マネージャ= "のCacheManager" /> 2 3 < -のCacheManagerのehcacheを構成! 4 ehcache.xmlファイル位置configLocationで指定- > 5 <ビーンID = "ehCacheManager"。 6クラス=。 "org.springframework.cache.ehcache.EhCacheManagerFactoryBean" 7 P:configLocation = "CLASSPATH:ehcache.xml"。 8 P:共有= "falseに" />。 9 < - Ehcacheのコンフィギュレーションベースのキャッシュマネージャ。! 10とEhcacheのキャッシュマネージャのCacheManager噴射ビーン- > 11 <ビーンID = "のCacheManager"。 12クラスである= "org.springframework.cache.ehcache.EhCacheCacheManager" 13 Pである:=のCacheManager-REF "ehCacheManager"> 14 </豆>
ここでは、完全なSpring構成であり、
1 <XMLバージョン= "1.0"エンコード= "UTF-8"?> 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。ORG /スキーマ/コンテキスト 12のhttp: //www.springframework。ORG /スキーマ/コンテキスト/スプリングコンテキスト4.0.xsd "> 13 14 <文脈:部品スキャン 15ベースパッケージ=" com.service「/> 16 17 <キャッシュ:annotation- =キャッシュマネージャドリブン"のCacheManager" /> 18である 。19 <! -のCacheManagerのehcacheを構成 configLocationで指定20はehcache.xmlファイルの場所である- > 21 <ビーンIDである= "ehCacheManager" 22は、クラス=「org.springframework.cacheあります.ehcache.EhCacheManagerFactoryBean " 23 Pである:configLocation =" CLASSPATH:ehcache.xml " 24 P:共有=" falseに「/> 25 < -キャッシュマネージャの設定Ehcacheのもと! のCacheManager 26とEhcacheのキャッシュマネージャーに注入されます豆- > 27 <豆ID = "のCacheManager" 28クラス= "org.springframework.cache.ehcache.EhCacheCacheManager" 29 P。CacheManager-REF = "ehCacheManager"> 30 </豆> 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の米国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つの春のストレージポリシーを設定するために使用されていない限り、Springのデフォルトがありますキャッシュ検索結果への鍵として入ってくるのパラメータの方法。
もちろん、我々はまた、主要な戦略を変更するように、最初の引数にしたがってなどの他の規格に春に従って、キャッシュ内の結果を得るために見て、キーと同じであるせることができます。
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の米国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()..行って falseに。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()..行って falseに。3
メソッド・レベルのキャッシュ
メソッド・レベルのキャッシュ方法は仕事、さまざまな方法は、あなたは、そのようなものが以下のように、未使用のバッファを設定することができます
1 @Service( "UserServiceの") 2パブリッククラス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の米国ctx.getBean =( "ことUserServiceの"、UserService.class) 。初めての方法を実行するための4 //方法それは本当に実行し、キャッシュします 5ユーザU1 = us.getUsersByNameAndAge(「ジョー・スミス」、500); 6 //同じパラメータを渡して、次の方法が、しかし、異なるキャッシュにおけるこれらの2つの方法から、キャッシュデータを使用することはできないが 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()..行って falseに3を trueに。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 @CacheEvict(値=真allEntriesに"ユーザー"、=) (){ 公共ボイド24 evictAll 25のSystem.out.println( " -キャッシュ全体を空- "); 26} 27}
ここではテストクラスがあり、
パブリック静的ボイドTEST2 1(){ 2 ClassPathXmlApplicationContext ApplicationContextの新しい新CTX =( "beans.xmlの"); 3 UserServiceの米国ctx.getBean =(UserService.class "UserServiceのその"); 2つのキャッシュシステム方法4 // 5ユーザーU1 = us.getUsersByNameAndAge( "ジョー・スミス"、500); 6 us.getAnotherUserユーザU2 =( "ジョン・ドウ"、400); 7 //コールevictUser()メソッドバッファデータを消去するために、指定された 「(8 us.evictUserをジョン・ドウ「400); 9 //クリアフロントジョン・ドウ、キャッシュ400、方法は、以下のデータが再びキャッシュされる返す 10ユーザU3 = us.getAnotherUser(」ジョン・ドウ」、400); 11システム。 out.printlnを(米国== U3); // falseに 12はすでに、データ500は、以下の方法を再実行しません、//ジョー・スミスデータキャッシュに直接アクセスするキャッシュされている// trueに出力 15 //は、全体のキャッシュをクリア 」(13ユーザU4 = us.getAnotherUserジョー・スミス」、500); 14のSystem.out.println(U1 == U4); // trueに出力 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()..実行される -ジョン・ドウ、400対応するキャッシュ排出- 3 4およびgetAnotherUser()..を実行 falseに5。 trueに6。 7 -キャッシュ全体を空にする- - 図8はgetAnotherUserが実行されている().. 9 getAnotherUser()..行われる。 falseに10 falseに11。