Contoh Ehcache Boot Musim Semi

1. Ikhtisar

Mari kita lihat contoh penggunaan Ehcache dengan Spring Boot. Kami akan menggunakan Ehcache versi 3 karena ini menyediakan implementasi manajer cache JSR-107.

Contohnya adalah layanan REST sederhana yang menghasilkan kuadrat dari sebuah angka.

2. Dependensi

 org.springframework.boot spring-boot-starter-web 2.2.2.RELEASE   org.springframework.boot spring-boot-starter-cache 2.2.2.RELEASE  javax.cache cache-api 1.1.1   org.ehcache ehcache 3.8.1  
  • pegas-boot-starter-web
  • spring-boot-starter-cache
  • javax.cache: cache-api
  • org.ehcache: ehcache

3. Contoh

Mari buat pengontrol REST sederhana yang memanggil layanan untuk mengkuadratkan angka dan mengembalikan hasilnya sebagai string JSON:

@RestController @RequestMapping("/number", MediaType.APPLICATION_JSON_UTF8_VALUE) public class NumberController { // ... @Autowired private NumberService numberService; @GetMapping(path = "/square/{number}") public String getSquare(@PathVariable Long number) { log.info("call numberService to square {}", number); return String.format("{\"square\": %s}", numberService.square(number)); } }

Sekarang mari kita buat layanannya.

Kami menganotasi metode dengan @Cacheable sehingga Spring akan menangani caching. Sebagai hasil dari anotasi ini, Spring akan membuat proxy NumberService untuk mencegat panggilan ke metode kuadrat dan memanggil Ehcache.

Kita perlu memberikan nama cache untuk digunakan dan secara opsional kuncinya. Kami juga dapat menambahkan kondisi untuk membatasi apa yang di-cache:

@Service public class NumberService { // ... @Cacheable( value = "squareCache", key = "#number", condition = "#number>10") public BigDecimal square(Long number) { BigDecimal square = BigDecimal.valueOf(number) .multiply(BigDecimal.valueOf(number)); log.info("square of {} is {}", number, square); return square; } }

Terakhir, mari buat aplikasi Spring Boot utama kita:

@SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }

4. Konfigurasi Cache

Kita perlu menambahkan anotasi @EnableCaching Spring ke kacang Spring sehingga manajemen cache berbasis anotasi Spring diaktifkan.

Mari buat kelas CacheConfig :

@Configuration @EnableCaching public class CacheConfig { }

Konfigurasi otomatis Spring menemukan implementasi Ehcache dari JSR-107. Namun, tidak ada cache yang dibuat secara default.

Karena baik Spring maupun Ehcache tidak mencari file ehcache.xml default . Kami menambahkan properti berikut untuk memberi tahu Spring di mana menemukannya:

spring.cache.jcache.config=classpath:ehcache.xml 

Mari buat file ehcache.xml dengan cache bernama squareCache :

  java.lang.Long java.math.BigDecimal  30    com.baeldung.cachetest.config.CacheEventLogger ASYNCHRONOUS UNORDERED CREATED EXPIRED    2 10   

Dan mari kita juga menambahkan acara Cache pendengar yang log baik DICIPTAKAN dan kadaluarsa peristiwa cache:

public class CacheEventLogger implements CacheEventListener { // ... @Override public void onEvent( CacheEvent cacheEvent) { log.info(/* message */, cacheEvent.getKey(), cacheEvent.getOldValue(), cacheEvent.getNewValue()); } }

5. Beraksi

Kita dapat menggunakan Maven untuk memulai aplikasi ini dengan menjalankan mvn spring-boot: run .

Kemudian buka browser dan akses layanan REST pada port 8080.

Jika kita pergi ke // localhost: 8080 / number / square / 12, maka kita akan mendapatkan kembali {"square": 144} , dan di log kita akan melihat:

INFO [nio-8080-exec-1] c.b.cachetest.rest.NumberController : call numberService to square 12 INFO [nio-8080-exec-1] c.b.cachetest.service.NumberService : square of 12 is 144 INFO [e [_default_]-0] c.b.cachetest.config.CacheEventLogger : Cache event CREATED for item with key 12. Old value = null, New value = 144

Kita bisa melihat pesan log dari persegi metode NumberService , dan MENCIPTAKAN acara dari EventLogger. Jika kita kemudian menyegarkan browser kita hanya akan melihat yang berikut ditambahkan ke log:

INFO [nio-8080-exec-2] c.b.cachetest.rest.NumberController : call numberService to square 12

Pesan log dalam metode kuadrat NumberService tidak dipanggil. Ini menunjukkan kepada kita bahwa nilai yang di-cache sedang digunakan.

Jika kita menunggu 30 detik hingga item yang di-cache kedaluwarsa dan menyegarkan browser, kita akan melihat event EXPIRED , dan nilai yang ditambahkan kembali ke cache:

INFO [nio-8080-exec-1] (...) NumberController : call numberService to square 12 INFO [e [_default_]-1] (...) CacheEventLogger : Cache event EXPIRED for item with key 12. Old value = 144,New value = null INFO [nio-8080-exec-1] (... )NumberService : square of 12 is 144 INFO [e [_default_]-1] (...) CacheEventLogger : Cache event CREATED for item with key 12. Old value = null, New value = 144

Jika kita memasukkan // localhost: 8080 / number / square / 3 ke dalam browser, kita mendapatkan jawaban yang benar dari 9, tetapi nilainya tidak di-cache.

Ini karena kondisi yang kami gunakan pada anotasi @Cacheable hanya untuk nilai cache untuk angka yang lebih tinggi dari 10.

6. Kesimpulan

Dalam tutorial singkat ini, kami menunjukkan cara mengatur Ehcache dengan Spring Boot.

Seperti biasa, kode dapat ditemukan di GitHub.