Der Caching -Mechanismus von Spring ist sehr flexibel und kann alle Bohnen- oder Bohnenmethoden im Behälter zwischenspeichern. Daher kann dieser Caching -Mechanismus auf jeder Ebene der Javaee -Anwendung zwischengespeichert werden.
Die zugrunde liegende Ebene des Feder -Cache muss auch mit Hilfe anderer Cache -Tools wie EHCache (Hibernate -Cache -Tool) implementiert werden, und die obere Ebene verwendet eine einheitliche API -Programmierung.
Um Spring -Cache zu verwenden, sind die folgenden drei Schritte erforderlich
Zum Beispiel
<xml Version = "1.0" coding = "utf-8"?> <Ehcache> <diskStore path = "java.io.tmpdir" /> <! MaxElementsDisk = "10000000" DiskexpiryThreadIntervalsEconds = "120" MemorySevictionPolicy = "LRU"/> <!-Konfigurieren Sie den Cache namens Benutzer-> <cache name = "Benutzer" maxelementssinmemory = "10000" Eternal = "False" OverflowtodisK = "true" timetoidesseconds = "300". timetoliveSeconds = "600" /> < /ehcache>
Das obige ehcache.xml konfiguriert zwei Cache -Bereiche. Die Bohnen im Frühling werden in diesen Cache -Bereichen zwischengespeichert. Im Allgemeinen wird in EHCache, wie viele Bohnen es im Federbehälter gibt, in EHCACHE definiert.
Konfigurieren Sie dann den Cache -Manager in der Feder -Konfigurationsdatei wie folgt, wobei die erste Bean eine Werksbean ist, mit der der CacheManager von EHCACHE konfiguriert wird, und die zweite Bean ist der Cache -Manager, der für Spring -Cache konfiguriert ist, sodass die erste Bohne in die zweite Bean injiziert wird.
<Cache: Annotationsgesteuert Cache-Manager = "CACHEMANAGER" /> <!-EHCACHE CACHEMANAGER so konfigurieren, dass der Speicherort der eHcache.xml-Datei konfiguriert wird-> <bean id = "EHCACHEMANAGER" P: configLocation = "ClassPath: Ehcache.xml" p: shared = ushcache "p: shared = ushcache" p: ellhcache "p:" p. " Ehcache CacheManager in den Cache-Manager Bean-> <bean id = "CACHEMANAGER" P: CACHEMANAGER-REF = "EHCACHEMANATER"> </bean>
Hier ist eine komplette Federkonfiguration.
<? xmlns: p = "http://www.springframework.org/schema/p" xmlns: cache = "http://www.springframework.org/schema/cache" xmlns: context = "http 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/context/context/context/contex./Sconte./Sconted./Sconte./Sconte./Sconte./Sconte./Sconte./Sconte./Sconte./Sconte./Sconte./Scontex./Scontex./Scontex./Scontex./Scontext/Scontext/Scontext/Scontext/Scontext/Scontext/Scontext/Scontext/Scontext/Scontexted.-context- <Kontext: Komponenten-scan-Basis-Package = "com.service" /> <cache: Annotationsbetrieben Cache-Manager = "CACHEMANAGER" /> <!-EHCache CacheManager Konfigurieren Sie den Speicherort der eHcache.xml-Datei durch configLocation-> <bean id = "EhcAchemanager" p. P: Shared = "False"/> <!-Konfigurieren Sie den EHCache-basierten Cache-Manager und injizieren Sie EHCache's CacheManager in die Cache-Manager Bean-> <bean id = "cachemanager" P: CACHEMANAGER-REF = "EHCACHEMANGE"> </bean> </beans> </beans> </beans>
Im Folgenden wird @Cacheable als Beispiel verwendet, um die Verwendung von Feder basierend auf EHCache -Cache zu demonstrieren. Cacheable wird verwendet, um Klassen oder Methoden zu ändern. Wenn die Klasse geändert wird, werden alle Methoden in der Klasse zwischengespeichert.
Cache auf Klassenebene
Zum Beispiel gibt es die folgenden Bohnenklassen.
@Service ("UserService") @cacheable (value = "user") public class userServiceImpl implementiert UserService {@Override public user getUsersbynameAnDage (String -Name, int age) {System.out.println ("Ausführung von GetUsersBynameAnDage () .."); Neuen Benutzer zurückgeben (Name, Alter); } @Override öffentlicher Benutzer getanotherUser (String -Name, int age) {System.out.println ("Ausführung von getAnotherUser () .."); Neuen Benutzer zurückgeben (Name, Alter); }}Klassenbasierter Cache werden alle Methoden in der Klasse zwischenspeichern. Nach dem Cache ruft das Programm eine Methode der Instanz dieser Klasse auf. Solange die übergebenen Parameter gleich sind, sucht Spring die Methode nicht tatsächlich aus, sondern sucht direkt nach den zwischengespeicherten Daten basierend auf den bestandenen Parametern!
Verwenden Sie beispielsweise zwischengespeicherte Daten wie unten.
public static void test2 () {applicationContext ctx = new classPathXmlApplicationContext ("beans.xml"); UserService us = ctx.getbean ("UserService", userService.class); Benutzer u1 = us.getUsersBynameAndage ("Zhang san", 50); // Da der gleiche Parameter verwendet wird, wenn die UserService -Methode im zweiten Mal bezeichnet wird, wird die reale Methode nicht ausgeführt. // Spring sucht direkt nach Daten nach Parametern aus dem Cache -Benutzer u2 = us.getanotheruser ("Zhang san", 50); System.out.println (u1 == U2); }Ausgangsergebnis,
GetUsersbynamandage () wird ausgeführt.
WAHR
Wie Sie sehen können, wird der obige GetanotherUser () nicht tatsächlich ausgeführt, da die übergebenen Parameter mit den von der vorherigen Methode übergebenen Parametern übereinstimmen, sodass der Frühling direkt aus den Cache -Bereichsdaten stammt.
Zusätzlich zum erforderlichen Attributwert hat die Annotation @Cacheable in der obigen Bean -Klasse auch einen Schlüssel, Zustand und es sei denn, Attribute. Die letzten drei werden zum Einstellen von Federspeicherrichtlinien verwendet. Für klassenbasierte Caches verwendet Spring die Parameter, die in der Methode als Schlüssel übergeben wurden, um nach Ergebnissen im Cache standardmäßig zu suchen.
Natürlich können wir auch die Strategie des Schlüssels ändern und den Frühling anderen Standards folgen lassen, z. B. ob der erste Parameter dem Schlüssel übereinstimmt, und die Ergebnisse im Cache nachschlagen.
Ändern Sie die obige Bohnenklasse wie folgt.
@Service ("UserService") @cacheable (value = "user", key = "#name") public class UserServiceImpl implementiert UserService {@Override Public User GetUsersBynameAnDage (String -Name, int Alter) {Dies bedeutet, dass der Spring die Methode nicht wirklich ausführt. Nur wenn der Name anders ist
public static void test2 () {applicationContext ctx = new classPathXmlApplicationContext ("beans.xml"); UserService us = ctx.getbean ("UserService", userService.class); Benutzer u1 = us.getUsersBynameAndage ("Zhang san", 50); // Nachdem der Schlüsselparameter @cacheable zu Key = "#Name" geändert hat, kann die folgende Methode ausgeführt werden. Benutzer u2 = us.getanotherUser ("li si", 50); System.out.println (u1 == U2); } Sie können sehen, dass diesmal getAnotherUser() ausgeführt wurde.
1 GetUsersbynamandage () wird ausgeführt.
2 GetanotherUser () wird ausgeführt.
3 Falsch
Wir können beispielsweise auch die Bedingungseigenschaft festlegen,
@Service ("UserService") @cacheable (value = "user", condition = "#ay 100") public class UserServiceImpl implementiert UserService {@Override Public User GetUsersByNaMeAnDage (String -Name, int Age) {Für den folgenden Code wird keine Methode zwischengespeichert. Spring führt die eigentliche Methode aus, um das Ergebnis jedes Mal zu erzielen.
public static void test2 () {applicationContext ctx = new classPathXmlApplicationContext ("beans.xml"); UserService us = ctx.getbean ("UserService", userService.class); Benutzer u1 = us.getUersbynamandage ("Zhang san", 500); Benutzer u2 = us.getanotherUser ("li si", 500); System.out.println (u1 == U2); }Ausführungsergebnisse,
GetUsersbynamandage () wird ausgeführt.
Getanotheruser () wird ausgeführt.
FALSCH
Cache auf Methodenebene funktioniert nur für die Methode. Verschiedene Methoden können unnötige Cache -Bereiche festlegen, wie die folgenden,
@Service ("UserService") Public Class UserServiceImpl implementiert UserService {@cacheable ("user1") @Override Public User GetUsersBynameAnDage (String -Name, int age) {System.out.println ("Execution Getusersbynamandage ()."); Neuen Benutzer zurückgeben (Name, Alter); } @Cacheable ("user2") @Override öffentlicher Benutzer getanotherUser (String -Name, int age) {System.out.println ("getAnotherUser () .."); Neuen Benutzer zurückgeben (Name, Alter); }}Verwenden Sie den folgenden Testcode,
public static void test2 () {applicationContext ctx = new classPathXmlApplicationContext ("beans.xml"); UserService us = ctx.getbean ("UserService", userService.class); // Das erste Mal, dass die Methode ausgeführt wird, wird die Methode ausgeführt und zwischen dem Benutzer u1 = us.getUsersbynameAndage ("Zhang san", 500); // Obwohl die folgende Methode die gleichen Parameter übergibt, da diese beiden Methoden in verschiedenen Cache -Bereichen enthalten sind, können die Cache -Daten nicht verwendet werden. Benutzer u2 = us.getanotherUser ("Zhang san", 500); System.out.println (u1 == U2); // Das oben genannte wurde zwischengespeichert und wird hier nicht ausgeführt. Verwenden Sie Cache direkt. Benutzer u3 = us.getanotheruser ("Zhang San", 500); System.out.println (u3 == u2); }Ausführungsergebnisse,
GetUsersbynamandage () wird ausgeführt.
Getanotheruser () wird ausgeführt.
FALSCH
WAHR
Die durch @cacheeVict geänderte Methode kann verwendet werden, um den Cache zu löschen, und die folgenden Eigenschaften können mit @CacheEvict angegeben werden.
Allentrennen, ob Sie den gesamten Cache -Bereich löschen sollen
Vor der Einführung: Unabhängig davon, ob der Cache vor der Ausführung der Methode gelöscht wird. Die Standardeinstellung besteht darin, es erst zu löschen, nachdem die Methode erfolgreich ausgeführt wurde.
Bedingung und Schlüssel, die gleiche Bedeutung wie in @Cacheable .
Die folgende Demonstration ist einfach.
@Service ("UserService")@cacheable ("Benutzer") öffentliche Klasse UserServiceImpl implementiert UserService {@Override Public User GetUsersBynameAndage (String -Name, int age) {System.out.Out.println ("Ausführung von Getusersbynamandage ()."); Oder "+name+", "+alter+");} // Geben Sie alle zwischengespeicherten Daten im Benutzer-Cache-Bereich an.Unten ist die Testklasse,
public static void test2 () {applicationContext ctx = new classPathXmlApplicationContext ("beans.xml"); UserService us = ctx.getbean ("UserService", userService.class); // Das System kann zwei Methoden von Benutzer u1 = us.getUsersbynameAndage ("Zhang san", 500) zwischengespeichert. Benutzer u2 = us.getanotherUser ("li si", 400); // rufen Sie die Evictuser () -Methode auf, um die im Puffer US.evictuser angegebenen Daten zu löschen ("li si", 400); // löschen li si, 400 Bevor die von der folgenden Methode zurückgegebenen Daten erneut zwischen dem Benutzer u3 = us.getanotheruser ("li si", 400) zwischengespeichert werden; System.out.println (US == U3); // false // Die Daten von Zhang SAN und 500 wurden zuvor zwischengespeichert, und die folgende Methode wird nicht erneut ausgeführt, und die Daten im Cache werden direkt von dem Benutzer u4 = us.getanotheruser ("Zhang SAN", 500) abgerufen. System.out.println (u1 == u4); // true ausgeben // den gesamten Cache löschen US.evictall (); // Da der gesamte Cache gelöscht wurde, wird der folgende Code wieder ausgesetzt. Benutzer u6 = us.getanotherUser ("li si", 400); System.out.println (u1 == U5); // false system.out.println ausgeben (u3 == u6); // false} ausgeben}Ausführungsergebnisse,
GetUsersbynamandage () wird ausgeführt.
Getanotheruser () wird ausgeführt.
-Legen Sie den Cache, der Li si, 400-, entsprechen
Getanotheruser () wird ausgeführt.
FALSCH
WAHR
-Legen Sie den gesamten Cache-
Getanotheruser () wird ausgeführt.
Getanotheruser () wird ausgeführt.
FALSCH
FALSCH
Das obige Vordergrund dreht sich alles um den Beispielcode für den Frühlings -Caching -Mechanismus in diesem Artikel. Ich hoffe, es wird für alle hilfreich sein. Interessierte Freunde können weiterhin auf andere verwandte Themen auf dieser Website verweisen. Wenn es Mängel gibt, hinterlassen Sie bitte eine Nachricht, um darauf hinzuweisen. Vielen Dank an Freunde für Ihre Unterstützung für diese Seite!