Mekanisme caching Spring sangat fleksibel dan dapat menyimpan metode kacang atau kacang apa pun dalam wadah. Oleh karena itu, mekanisme caching ini dapat di -cache pada setiap tingkat aplikasi Javaee.
Lapisan yang mendasari cache pegas juga perlu diimplementasikan dengan bantuan alat cache lainnya, seperti EHCACHE (alat cache hibernate), dan lapisan atas menggunakan pemrograman API terpadu.
Untuk menggunakan cache pegas, tiga langkah berikut diperlukan
Misalnya
<?xml version="1.0" encoding="UTF-8"?><ehcache> <diskStore path="java.io.tmpdir" /> <!-- Configure the default cache --> <defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" maxElementsOnDisk="10000000" diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU"/> <!-- Configure the cache named users --> <cache name="users" maxElementsInMemory="10000" eternal="false" overflowToDisk="true" timeToIdleSeconds="300" timeToLiveSeconds="600" /> < /ehcache>
ehcache.xml di atas mengkonfigurasi dua area cache. Kacang di musim semi akan di -cache di area cache ini. Secara umum, berapa banyak kacang yang ada di dalam wadah musim semi akan didefinisikan dalam ehcache.
Kemudian konfigurasikan Cache Manager dalam file konfigurasi pegas sebagai berikut, di mana kacang pertama adalah kacang pabrik yang digunakan untuk mengonfigurasi cacheManager Ehcache, dan kacang kedua adalah manajer cache yang dikonfigurasi untuk cache pegas, sehingga kacang pertama disuntikkan ke dalam kacang kedua.
<cache:annotation-driven cache-manager="cacheManager" /> <!-- Configure EhCache CacheManager to specify the location of the ehcache.xml file through configLocation --> <bean id="ehCacheManager" p:configLocation="classpath:ehcache.xml" p:shared="false" /> <!-- Configure EhCache-based cache manager and inject EHCACHE CACHEMANGER Into The Cache Manager Bean-> <bean id = "cachemanager" P: cachemanager-ref = "ehcachemanager"> </t bean>
Berikut ini adalah konfigurasi pegas yang lengkap.
<? XML Versi = "1.0" encoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmls xmlns: p = "http://www.springframework.org/schema/p" xmlns: cache = "http://www.springframework.org/schema/cache" xmlns: context = "http:/www.schex XSI: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http:/wwww.spramework.orger.orger http://www.springframework.org/schema/cache/spring-cache-44 <context:component-scan base-package="com.service"/> <cache:annotation-driven cache-manager="cacheManager" /> <!-- Configure EhCache CacheManager Specify the location of the ehcache.xml file through configLocation --> <bean id="ehCacheManager" p:configLocation="classpath:ehcache.xml" P: Shared = "false"/> <!-Mengkonfigurasi Cache Manager berbasis EHCACHE dan menyuntikkan Cachemanager Ehcache ke dalam Cache Manager Bean-> <bean id = "CacheManager" P: CacheManager-Ref = "Ehcachemanager"> </bean> </beans>
Berikut ini akan menggunakan @Cacheable sebagai contoh untuk menunjukkan penggunaan pegas berdasarkan cache ehcache. Cacheable digunakan untuk memodifikasi kelas atau metode. Jika kelas dimodifikasi, semua metode di kelas akan di -cache.
Cache tingkat kelas
Misalnya, ada kelas kacang berikut,
@Service ("Userservice") @cacheable (value = "Users") Public Class UserserviceImpl mengimplementasikan UsersEverService {@Override Public User GetUsersByNeAndage (nama string, usia) {System.out.println ("mengeksekusi getUsersByNeAndage () () .."); mengembalikan pengguna baru (nama, usia); } @Override pengguna publik getanotherUser (nama string, int usia) {System.out.println ("mengeksekusi getanotherUser () .."); mengembalikan pengguna baru (nama, usia); }}Cache berbasis kelas akan menyimpan semua metode di kelas. Setelah cache, program memanggil metode apa pun dari contoh kelas ini. Selama parameter yang diteruskan adalah sama, Spring tidak akan benar -benar menjalankan metode, tetapi akan secara langsung mencari data yang di -cache berdasarkan parameter yang dilewatkan!
Misalnya, gunakan data cache seperti di bawah ini.
public static void test2 () {applicationContext ctx = new classpathxmlapplicationContext ("beans.xml"); UserserService US = ctx.getBean ("UserserService", UsserService.class); Pengguna U1 = US.GetUsersByNeAndage ("Zhang San", 50); // Karena parameter yang sama digunakan ketika metode UserService disebut kedua kalinya, metode nyata tidak akan dieksekusi, // Spring akan secara langsung mencari data berdasarkan parameter dari pengguna cache u2 = us.getanotherUser ("Zhang SAN", 50); System.out.println (u1 == u2); }Hasil output,
GetUsersByNeAndage () sedang dieksekusi ..
BENAR
Seperti yang Anda lihat, getAnotherUser di atas () sebenarnya tidak dieksekusi karena parameter yang dilewatkan sama dengan parameter yang dilewati dengan metode sebelumnya, sehingga pegas langsung berasal dari data area cache.
Selain nilai atribut yang diperlukan, anotasi @Cacheable di kelas kacang di atas juga memiliki kunci, kondisi, dan kecuali atribut. Tiga terakhir digunakan untuk mengatur kebijakan penyimpanan pegas. Untuk cache berbasis kelas, Spring menggunakan parameter yang dilewati dalam metode sebagai kunci untuk mencari hasil dalam cache secara default.
Tentu saja, kami juga dapat memodifikasi strategi kunci dan membiarkan Spring mengikuti standar lain, seperti apakah parameter pertama sama dengan kunci, dan mencari hasil dalam cache.
Ubah kelas kacang di atas sebagai berikut,
@Service ("Userservice") @cacheable (value = "users", key = "#name") kelas publik UserserServiceImpl mengimplementasikan UserserService {@Override pengguna publik getUsersByNeAndage (nama string, int usia) {Artinya kita lulus dengan nama yang sama, Spring tidak akan benar -benar menjalankan metode ini. Hanya ketika namanya berbeda, metode akan dieksekusi, misalnya,
public static void test2 () {applicationContext ctx = new classpathxmlapplicationContext ("beans.xml"); UserserService US = ctx.getBean ("UserserService", UsserService.class); Pengguna U1 = US.GetUsersByNeAndage ("Zhang San", 50); // Setelah mengubah parameter kunci @cacheable menjadi key = "#name", metode berikut akan dapat dieksekusi. Pengguna u2 = us.getanotherUser ("li si", 50); System.out.println (u1 == u2); } Anda dapat melihat bahwa kali ini metode getAnotherUser() telah dieksekusi.
1 getUsersByNeAndage () sedang dieksekusi ..
2 getanotherUser () sedang dieksekusi ..
3 false
Kami juga dapat mengatur properti kondisi, misalnya,
@Service ("Userservice") @cacheable (value = "users", condition = "#use <100") Public Class UserserviceImpl mengimplementasikan UserserService {@Override Public User GetUsersByNeAndage (nama string, int usia) {Jadi untuk kode berikut, tidak ada metode yang akan di -cache. Spring menjalankan metode nyata untuk mendapatkan hasilnya setiap saat.
public static void test2 () {applicationContext ctx = new classpathxmlapplicationContext ("beans.xml"); UserserService US = ctx.getBean ("UserserService", UsserService.class); Pengguna U1 = US.GetUsersByNeAndage ("Zhang San", 500); Pengguna u2 = us.getanotherUser ("li si", 500); System.out.println (u1 == u2); }Hasil eksekusi,
GetUsersByNeAndage () sedang dieksekusi ..
GetanotherUser () sedang dieksekusi ..
PALSU
Cache tingkat metode hanya akan berfungsi untuk metode ini. Metode yang berbeda dapat mengatur area cache yang tidak perlu, seperti berikut ini,
@Service ("Userservice") Kelas Publik UserserServiceImpl mengimplementasikan UsersEverService {@cacheable ("Users1") @Override pengguna publik getUsersByNeAndage (nama string, usia int) {System.out.println ("Eksekusi getUsersByNeAndage () () .."); mengembalikan pengguna baru (nama, usia); } @Cacheable ("Users2") @Override pengguna publik getanotherUser (nama string, int usia) {System.out.println ("getanotherUser () .."); mengembalikan pengguna baru (nama, usia); }}Gunakan kode uji berikut,
public static void test2 () {applicationContext ctx = new classpathxmlapplicationContext ("beans.xml"); UserserService US = ctx.getBean ("UserserService", UsserService.class); // Pertama kali metode ini dieksekusi, metode ini akan dieksekusi dan di -cache User u1 = US.getUsersByNeAndage ("Zhang San", 500); // Meskipun metode berikut melewati parameter yang sama, karena kedua metode ini berada di area cache yang berbeda, data cache tidak dapat digunakan. Pengguna U2 = US.GetanotherUser ("Zhang San", 500); System.out.println (u1 == u2); // Di atas telah di -cache, dan tidak akan dieksekusi di sini. Gunakan cache secara langsung. Pengguna U3 = US.GetanotherUser ("Zhang San", 500); System.out.println (u3 == u2); }Hasil eksekusi,
GetUsersByNeAndage () sedang dieksekusi ..
GetanotherUser () sedang dieksekusi ..
PALSU
BENAR
Metode yang dimodifikasi oleh @cacheevict dapat digunakan untuk menghapus cache, dan properti berikut dapat ditentukan menggunakan @CacheEvict .
Allentries, apakah akan menghapus seluruh area cache
Sebelum bervokasi: apakah akan menghapus cache sebelum menjalankan metode. Standarnya adalah untuk menghapus hanya setelah metode dieksekusi dengan sukses.
Kondisi dan kunci, makna yang sama seperti di @Cacheable .
Demonstrasi berikut sederhana.
@Service ("Userservice")@cacheable ("Users") Public Class UserserServiceImpl mengimplementasikan UserserService {@Override pengguna publik getUsersByNeAndage (nama string, usia) {System.out.println ("Executing getUsersByNeAndage () .."); kembalikan pengguna baru (nama, usia); {System.out.println("Executing getAnotherUser()..");return new User(name,age);}//Specify clear cache according to name and age parameters @CacheEvict(value="users") public void evictUser(String name, int age) {System.out.println("--Clearing the corresponding cache of "+name+","+age+");}//Specify Membersihkan semua data yang di-cache di area cache pengguna @cacheevict (value = "users", allentries = true) public void extall () {System.out.println ("-Membersihkan seluruh cache--");}}Di bawah ini adalah kelas uji,
public static void test2 () {applicationContext ctx = new classpathxmlapplicationContext ("beans.xml"); UserserService US = ctx.getBean ("UserserService", UsserService.class); // Sistem akan menyimpan dua metode pengguna u1 = us.getUsersByNeAndage ("Zhang San", 500); Pengguna u2 = us.getanotherUser ("li si", 400); // Panggil metode Excuser () untuk menghapus data yang ditentukan dalam buffer us.evictuser ("Li Si", 400); // CLEAR LI SI, 400 Sebelum data yang dikembalikan dengan metode berikut akan di -cache lagi pengguna U3 = US.getanotherUser ("Li Si", 400); System.out.println (US == U3); // false // Data Zhang San dan 500 telah di-cache sebelumnya, dan metode berikut tidak akan dieksekusi ulang, dan data dalam cache akan langsung diambil pengguna u4 = us.getanotherUser ("Zhang San", 500); System.out.println (u1 == u4); // output true // hapus seluruh cache us.evictall (); // Karena seluruh cache telah dihapus, kode berikut akan menjadi pengguna ulang U5 = US.getanotherUser ("Zhang San", 500); Pengguna u6 = us.getanotherUser ("li si", 400); System.out.println (u1 == u5); // output false system.out.println (u3 == u6); // output false}Hasil eksekusi,
GetUsersByNeAndage () sedang dieksekusi ..
GetanotherUser () sedang dieksekusi ..
-Membersihkan cache yang sesuai dengan Li Si, 400-
GetanotherUser () sedang dieksekusi ..
PALSU
BENAR
-membersihkan seluruh cache-
GetanotherUser () sedang dieksekusi ..
GetanotherUser () sedang dieksekusi ..
PALSU
PALSU
Di atas adalah semua tentang kode contoh mekanisme caching pegas dalam artikel ini, saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke topik terkait lainnya di situs ini. Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya. Terima kasih teman atas dukungan Anda untuk situs ini!