1. Información general
Veamos un ejemplo del uso de Ehcache con Spring Boot. Usaremos Ehcache versión 3 ya que proporciona una implementación de un administrador de caché JSR-107.
El ejemplo es un servicio REST simple que produce el cuadrado de un número.
2. Dependencias
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
- caché de arranque de arranque de primavera
- javax.cache: cache-api
- org.ehcache: ehcache
3. Ejemplo
Creemos un controlador REST simple que llame a un servicio para cuadrar un número y devuelva el resultado como una cadena 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)); } }
Ahora creemos el servicio.
Anotamos el método con @Cacheable para que Spring maneje el almacenamiento en caché. Como resultado de esta anotación, Spring creará un proxy de NumberService para interceptar llamadas al método cuadrado y llamar a Ehcache.
Necesitamos proporcionar el nombre de la caché a usar y, opcionalmente, la clave. También podemos agregar una condición para restringir lo que se almacena en caché:
@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; } }
Finalmente, creemos nuestra aplicación principal Spring Boot:
@SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
4. Configuración de caché
Necesitamos agregar la anotación @EnableCaching de Spring a un bean de Spring para que la administración de caché basada en anotaciones de Spring esté habilitada.
Creemos una clase CacheConfig :
@Configuration @EnableCaching public class CacheConfig { }
La configuración automática de Spring encuentra la implementación de JSR-107 de Ehcache. Sin embargo, no se crean cachés de forma predeterminada.
Porque ni Spring ni Ehcache buscan un archivo ehcache.xml predeterminado . Agregamos la siguiente propiedad para decirle a Spring dónde encontrarla:
spring.cache.jcache.config=classpath:ehcache.xml
Creemos un archivo ehcache.xml con un caché llamado squareCache :
java.lang.Long java.math.BigDecimal 30 com.baeldung.cachetest.config.CacheEventLogger ASYNCHRONOUS UNORDERED CREATED EXPIRED 2 10
Y también agreguemos el detector de eventos de caché que registra eventos de caché CREADOS y EXPIRADOS :
public class CacheEventLogger implements CacheEventListener { // ... @Override public void onEvent( CacheEvent cacheEvent) { log.info(/* message */, cacheEvent.getKey(), cacheEvent.getOldValue(), cacheEvent.getNewValue()); } }
5. En acción
Podemos usar Maven para iniciar esta aplicación ejecutando mvn spring-boot: run .
Luego abra un navegador y acceda al servicio REST en el puerto 8080.
Si vamos a // localhost: 8080 / number / square / 12, volveremos {“square”: 144} , y en el registro veremos:
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
Podemos ver el mensaje de registro del método cuadrado de NumberService y el evento CREATED del EventLogger. Si luego actualizamos el navegador, solo veremos lo siguiente agregado al registro:
INFO [nio-8080-exec-2] c.b.cachetest.rest.NumberController : call numberService to square 12
No se invoca el mensaje de registro en el método cuadrado de NumberService . Esto nos muestra que se está utilizando el valor almacenado en caché.
Si esperamos 30 segundos para que el elemento almacenado en caché expire y refrescamos el navegador, veremos un evento EXPIRED y el valor agregado nuevamente en el caché:
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
Si ingresamos // localhost: 8080 / number / square / 3 en el navegador, obtenemos la respuesta correcta de 9, pero el valor no se almacena en caché.
Esto se debe a la condición que usamos en la anotación @Cacheable para almacenar en caché solo los valores para números superiores a 10.
6. Conclusión
En este tutorial rápido, mostramos cómo configurar Ehcache con Spring Boot.
Como siempre, el código se puede encontrar en GitHub.