Spring Boot Ehcache-voorbeeld

1. Overzicht

Laten we eens kijken naar een voorbeeld van het gebruik van Ehcache met Spring Boot. We gebruiken Ehcache versie 3 omdat dit een implementatie biedt van een JSR-107 cache manager.

Het voorbeeld is een eenvoudige REST-service die het kwadraat van een getal produceert.

2. Afhankelijkheden

 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 
  • spring-boot-starter-web
  • spring-boot-starter-cache
  • javax.cache: cache-api
  • org.ehcache: ehcache

3. Voorbeeld

Laten we een eenvoudige REST-controller maken die een service aanroept om een ​​getal te kwadrateren en het resultaat als een JSON-string retourneert:

@RestController @RequestMapping ("/ number", MediaType.APPLICATION_JSON_UTF8_VALUE) openbare klasse NumberController {// ... @Autowired privé NumberService numberService; @GetMapping (path = "/ square / {number}") public String getSquare (@PathVariable Lang nummer) {log.info ("call numberService to square {}", nummer); return String.format ("{\" vierkant \ ":% s}", numberService.square (nummer)); }}

Laten we nu de service maken.

We annoteren de methode met @Cacheable zodat Spring de caching afhandelt. Als resultaat van deze annotatie maakt Spring een proxy van de NumberService om oproepen naar de plein methode en roep Ehcache aan.

We moeten de naam van de te gebruiken cache opgeven en optioneel de sleutel. We kunnen ook een voorwaarde toevoegen om te beperken wat er in de cache wordt opgeslagen:

@Service openbare klasse NumberService {// ... @Cacheable (waarde = "squareCache", key = "#number", condition = "#number> 10") openbaar BigDecimal-vierkant (lang getal) {BigDecimal-vierkant = BigDecimal.valueOf (nummer) .multiply (BigDecimal.valueOf (nummer)); log.info ("vierkant van {} is {}", getal, vierkant); terugkeer vierkant; }}

Laten we tot slot onze belangrijkste Spring Boot-applicatie maken:

@SpringBootApplication openbare klasse Toepassing {openbare statische leegte hoofd (String [] args) {SpringApplication.run (Application.class, args); }}

4. Cacheconfiguratie

We moeten Spring's toevoegen @EnableCaching annotatie op een Spring bean zodat het annotatiegestuurde cachebeheer van Spring wordt ingeschakeld.

Laten we een CacheConfig klasse:

@Configuration @EnableCaching openbare klasse CacheConfig {}

De automatische configuratie van Spring vindt de implementatie van Ehcache van JSR-107. Er worden echter standaard geen caches gemaakt.

Omdat noch Spring noch Ehcache naar een standaard zoekt ehcache.xml het dossier. We voegen de volgende eigenschap toe om Spring te vertellen waar het te vinden is:

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

Laten we een ehcache.xml bestand met een cache genaamd squareCache:

  java.lang.Long java.math.BigDecimal 30 com.baeldung.cachetest.config.CacheEventLogger ASYNCHRONE ONDERGEMAAKT VERLOPEN 2 10 

En laten we ook de cache-gebeurtenislistener toevoegen die beide registreert GECREËERD en NIET MEER GELDIG cache-evenementen:

openbare klasse CacheEventLogger implementeert CacheEventListener {// ... @Override public void onEvent (CacheEvent cacheEvent) {log.info (/ * bericht * /, cacheEvent.getKey (), cacheEvent.getOldValue (), cacheEvent.getNewValue ()); }}

5. In actie

We kunnen Maven gebruiken om deze app te starten door uit te voeren mvn spring-boot: run.

Open vervolgens een browser en open de REST-service op poort 8080.

Als we naar // localhost: 8080 / nummer / vierkant / 12, dan komen we terug {"Vierkant": 144}, en in het logboek zien we:

INFO [nio-8080-exec-1] cbcachetest.rest.NumberController: bel nummerService naar vierkant 12 INFO [nio-8080-exec-1] cbcachetest.service.NumberService: vierkant van 12 is 144 INFO [e [_default_] -0] cbcachetest.config.CacheEventLogger: Cachegebeurtenis GEMAAKT voor item met sleutel 12. Oude waarde = null, Nieuwe waarde = 144

We kunnen het logbericht zien van het plein methode van NumberService, en de GECREËERD event uit de EventLogger. Als we vervolgens de browser vernieuwen, zien we alleen het volgende toegevoegd aan het logboek:

INFO [nio-8080-exec-2] c.b.cachetest.rest.NumberController: bel nummerService naar vierkant 12

Het logbericht in het plein methode van NumberService wordt niet aangeroepen. Dit laat ons zien dat de gecachte waarde wordt gebruikt.

Als we 30 seconden wachten totdat het item in de cache is verlopen en de browser vernieuwen, zien we een NIET MEER GELDIG evenement, en de waarde die weer in de cache wordt toegevoegd:

INFO [nio-8080-exec-1] (...) NumberController: bel nummerService naar vierkant 12 INFO [e [_default _] - 1] (...) CacheEventLogger: Cachegebeurtenis VERLOPEN voor item met sleutel 12. Oude waarde = 144, Nieuwe waarde = null INFO [nio-8080-exec-1] (...) NumberService: vierkant van 12 is 144 INFO [e [_default _] - 1] (...) CacheEventLogger: Cache-gebeurtenis GECREËERD voor item met key 12. Oude waarde = null, Nieuwe waarde = 144

Als we binnenkomen // localhost: 8080 / nummer / vierkant / 3 in de browser krijgen we het juiste antwoord van 9, maar de waarde wordt niet in de cache opgeslagen.

Dit komt door de conditie die we gebruikten op de @Cacheable annotatie om alleen waarden te cachen voor getallen hoger dan 10.

6. Conclusie

In deze korte tutorial hebben we laten zien hoe je Ehcache instelt met Spring Boot.

Zoals altijd is de code te vinden op GitHub.