Springのキャッシングメカニズムは非常に柔軟であり、コンテナ内のあらゆる豆または豆のメソッドをキャッシュできます。したがって、このキャッシングメカニズムは、Javaeeアプリケーションのあらゆるレベルでキャッシュできます。
Springキャッシュの基礎となる層も、Ehcache(Hibernate Cache Tool)などの他のキャッシュツールの助けを借りて実装する必要があり、上層は統一されたAPIプログラミングを使用します。
スプリングキャッシュを使用するには、次の3つのステップが必要です
例えば
<?xml version = "1.0" encoding = "utf-8"?> <ehcache> <diskstore path = "java.io.tmpdir" /> <! - デフォルトのキャッシュを構成 - > <defaultcache maxelementinmemory = "10000" eteernal = "false" fals maxelementsondisk = "10000000" diskexpirythreadintervalseconds = "120" memorystoreevictionpolicy = "lru"/> <! - ユーザーという名前のキャッシュを構成 - > <キャッシュ名= "ユーザー=" maxelementinmemory = "10000" etertodisk = "timetoideConds =" 300 " TimeTolivesConds = "600" /> < /ehcache>
上記のehcache.xml 、2つのキャッシュ領域を構成します。春の豆は、これらのキャッシュエリアでキャッシュされます。一般的に、spring容器にはehcacheで定義されている豆の数があります。
次に、Spring構成ファイルのキャッシュマネージャーを次のように構成します。最初のBeanはEhcacheのCacheManagerの構成に使用される工場豆であり、2番目のBeanはSpringキャッシュ用に構成されたキャッシュマネージャーであるため、最初のBeanが2番目のBeanに注入されます。
<キャッシュ:Annotation-driven Cache-Manager = "CacheManager" /> <! - ehcache cachemanagerを設定して、configlocationを介してehcache.xmlファイルの場所を指定するように - > <bean id = "ehcachemanager" p:configlocation = "classpath:ehcache.xml" /<!キャッシュマネージャーBeanにEhcache CacheManagerを注入 - > <Bean Id = "CacheManager" P:CacheManager-Ref = "ehcachemanager"> </bean>
これが完全なスプリング構成です。
<?xml version = "1.0" encoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns:p = "http://www.springframework.org/schema/p" xmlns:cache = "http://www.springframework.org/schema/cache" xmlns:context = "http://ww.springframework. xsi:schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.orgwork/schema/schema. http://www.springframework.org/schema/cache/spring-cache-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context-4.0.context-4.0.context-4.0.context-4.0. <コンテキスト:Component-Scanベースパッケージ= "com.service" /> <キャッシュ:annotation-driven cache-manager = "cachemanager" /> <! - ehcache cachemanagerの構成ehcache.xmlファイルの設定Configlocation-> <bean id = "ehcachemanager" cluselocation "clusemal" cluseman "clutionm P:shared = "false"/> <! - ehcacheベースのキャッシュマネージャーを構成し、ehcacheのキャッシュマネージャーをキャッシュマネージャーBeanに注入します - > <bean id = "cachemanager" p:cachemanager-ref = "ehcachemanager"> </bean> </beans> </beans>
以下は、Ehcacheキャッシュに基づいてSpringの使用を実証するために、例として@Cacheableを使用します。 Cacheableは、クラスまたはメソッドを変更するために使用されます。クラスが変更されている場合、クラス内のすべてのメソッドがキャッシュされます。
クラスレベルのキャッシュ
たとえば、次の豆のクラスがあります。
@service( "userservice") @cachable(value = "users")public class userserviceimpl emprence userservice {@override public user getusersbynameandage(string name、int age){system.out.println( "getusersbynameandage()" .. ");新しいユーザー(名前、年齢)を返します。 } @OverrideパブリックユーザーgetAnotheruser(string name、int age){system.out.println( "getanotheruser().."を実行する ");新しいユーザー(名前、年齢)を返します。 }}クラスベースのキャッシュは、クラス内のすべてのメソッドをキャッシュします。キャッシュ後、プログラムはこのクラスのインスタンスの任意の方法を呼び出します。合格したパラメーターが同じである限り、Springは実際にメソッドを実行するのではなく、合格したパラメーターに基づいてキャッシュされたデータを直接検索します!
たとえば、以下のようなキャッシュデータを使用します。
public static void test2(){applicationContext ctx = new classpathxmlapplicationContext( "beans.xml"); userservice us = ctx.getbean( "userservice"、userservice.class);ユーザーu1 = us.getusersbynameandage( "Zhang San"、50); //ユーザーサービスメソッドが2回目と呼ばれるときに同じパラメーターが使用されるため、実際のメソッドは実行されません。 System.out.println(u1 == u2); }出力結果、
getUsersByNameandage()が実行されています。
真実
ご覧のとおり、上記のgetAnotheruser()は実際には実行されません。これは、渡されたパラメーターが以前の方法で渡されたパラメーターと同じであるため、スプリングはキャッシュ領域データから直接送られます。
必要な属性値に加えて、上記のBeanクラスのAnnotation @Cacheableには、属性も属性を除いてもあります。最後の3つは、スプリングストレージポリシーを設定するために使用されます。クラスベースのキャッシュの場合、Springはメソッドで渡されたパラメーターをキーとして使用して、デフォルトでキャッシュの結果を検索します。
もちろん、キーの戦略を変更し、最初のパラメーターがキーと同じかどうかなど、Springを他の標準に従うこともでき、キャッシュの結果を調べることもできます。
上記の豆のクラスを次のように変更し、
@service( "userservice") @cachable(value = "users"、key = "#name")public class userserviceimpl emprence userservice {@override public user getusersbynameandage(string name、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 false
たとえば、条件プロパティを設定することもできます。
@service( "userservice") @cachable(value = "users"、condition = "#age <100")public class userserviceimplはuserservice {@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);ユーザーu2 = us.getanotheruser( "li si"、500); System.out.println(u1 == u2); }実行結果、
getUsersByNameandage()が実行されています。
getanotheruser()が実行されています。
間違い
メソッドレベルのキャッシュは、メソッドに対してのみ機能します。さまざまな方法で、次のような不必要なキャッシュ領域を設定できます。
@Service( "Userservice")Public Class UserserviceImplはuserservice {@cachable( "users1")@override public user getusersbynameandage(string name、int age){system.out.println( "getusersbynameandage()..");新しいユーザー(名前、年齢)を返します。 } @cachable( "users2")@overrideパブリックユーザーgetanotheruser(string name、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)。 //次のメソッドは同じパラメーターを渡しますが、これらの2つのメソッドは異なるキャッシュ領域にあるため、キャッシュデータは使用できません。ユーザーu2 = us.getanotheruser( "Zhang San"、500); System.out.println(u1 == u2); //上記はキャッシュされており、ここでは実行されません。キャッシュを直接使用します。ユーザーu3 = us.getanotheruser( "Zhang San"、500); System.out.println(u3 == u2); }実行結果、
getUsersByNameandage()が実行されています。
getanotheruser()が実行されています。
間違い
真実
@cacheevictによって変更された方法を使用してキャッシュをクリアでき、 @CacheEvictを使用して次のプロパティを指定できます。
Allentries、キャッシュ領域全体をクリアするかどうか
Invocationの前:メソッドを実行する前にキャッシュをクリアするかどうか。デフォルトは、メソッドが正常に実行された後にのみクリアすることです。
条件とキー、 @Cacheableと同じ意味。
次のデモは簡単です。
@service( "userservice")@cachable( "users")public class userserviceimpl emprence userservice {@override public user getusersbynameandage(string name、int age){system.out.println( "getusersbynameandageの実行().. {system.out.println( "getanotheruser().."を実行する "); return new user(name、age);} //名前と年齢のパラメーター@cacheevict(value =" users ")public void evictuser(string name、int age){system.out.out.out.println("+sect of sec of "ユーザーキャッシュ領域のすべてのキャッシュデータをクリアする@cacheevict(value = "users"、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); //システムは2つの方法をキャッシュしますユーザーu1 = us.getusersbynameandage( "Zhang San"、500);ユーザーu2 = us.getanotheruser( "li si"、400); // victuser()メソッドを呼び出して、buffer us.evictuser( "li si"、400)で指定されたデータをクリアします。 // clear li si、次の方法で返されるデータが再びキャッシュされる前に400ユーザーu3 = us.getanotheruser( "li si"、400); System.out.println(us == u3); // false // Zhang Sanと500のデータは以前にキャッシュされており、次の方法は再実行されず、キャッシュ内のデータは直接取得されますuser u4 = us.getanotheruser( "Zhang San"、500); System.out.println(u1 == u4); //出力true // cache us.evictall()全体をクリアします。 //キャッシュ全体がクリアされているため、次のコードはユーザーu5 = us.getanotheruser( "zhang san"、500)を再実行します。ユーザーu6 = us.getanotheruser( "li si"、400); System.out.println(u1 == u5); // false system.out.println(u3 == u6)を出力します。 // false出力}実行結果、
getUsersByNameandage()が実行されています。
getanotheruser()が実行されています。
- li siに対応するキャッシュのクリア、400-
getanotheruser()が実行されています。
間違い
真実
- キャッシュ全体をクリアする -
getanotheruser()が実行されています。
getanotheruser()が実行されています。
間違い
間違い
上記は、この記事の春のキャッシングメカニズムの例コードに関するすべてです。誰にとっても役立つことを願っています。興味のある友人は、このサイトの他の関連トピックを引き続き参照できます。欠点がある場合は、それを指摘するためにメッセージを残してください。このサイトへのご支援をありがとうございました!