1. Обзор
Давайте рассмотрим пример использования Ehcache с Spring Boot. Мы будем использовать Ehcache версии 3, так как это обеспечивает реализацию диспетчера кэша JSR-107 .
Пример – простая служба REST, которая производит квадрат числа.
2. Зависимости
org.springframework.boot spring-boot-starter-web 2.4.0 org.springframework.boot spring-boot-starter-cache 2.4.0 javax.cache cache-api 1.1.1 org.ehcache ehcache 3.8.1
3. Пример
Давайте создадим простой контроллер REST, который вызывает службу для возведения числа в квадрат и возвращает результат в виде строки 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)); } }
Теперь давайте создадим сервис.
Мы аннотируем метод с помощью @Cacheable , чтобы Spring обрабатывал кэширование. В результате этой аннотации Spring создаст прокси-сервер службы Number для перехвата вызовов метода square и вызова Ehcache.
Нам нужно указать имя используемого кэша и, возможно, ключ. Мы также можем добавить условие для ограничения того, что кэшируется:
@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; } }
Наконец, давайте создадим наше основное приложение Spring Boot:
@SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
4. Конфигурация кэша
Нам нужно добавить аннотацию Spring @EnableCaching в компонент Spring, чтобы было включено управление кэшем на основе аннотаций Spring.
Давайте создадим Cache Config класс:
@Configuration @EnableCaching public class CacheConfig { }
Автоматическая конфигурация Spring находит реализацию Ehcache JSR-107. Однако по умолчанию кэши не создаются.
Потому что ни Spring, ни Ehcache не ищут значение по умолчанию ehcache.xml файл. Мы добавляем следующее свойство, чтобы сообщить Spring, где его найти:
spring.cache.jcache.config=classpath:ehcache.xml
Давайте создадим ehcache.xml файл с кэшем под названием square Cash :
java.lang.Long java.math.BigDecimal 30 com.baeldung.cachetest.config.CacheEventLogger ASYNCHRONOUS UNORDERED CREATED EXPIRED 2 10
И давайте также добавим прослушиватель событий кэша, который регистрирует как СОЗДАННЫЕ , так и ИСТЕКШИЕ события кэша:
public class CacheEventLogger implements CacheEventListener
5. В действии
Мы можем использовать Maven для запуска этого приложения, запустив mvn spring-boot:run .
Затем откройте браузер и получите доступ к службе REST на порту 8080.
Если мы пойдем в http://localhost:8080/number/square/12 , затем мы вернемся {“квадрат”:144} , и в журнале мы увидим:
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
Мы можем видеть сообщение журнала из метода square службы Number и СОЗДАННОЕ событие из регистратора событий. Если мы затем обновим браузер, мы увидим только следующее, добавленное в журнал:
INFO [nio-8080-exec-2] c.b.cachetest.rest.NumberController : call numberService to square 12
Сообщение журнала в методе square службы Number не вызывается. Это показывает нам, что используется кэшированное значение.
Если мы подождем 30 секунд, пока срок действия кэшированного элемента истечет, и обновим браузер, мы увидим событие EXPIRED , и добавленную стоимость обратно в кэш:
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
Если мы войдем http://localhost:8080/number/square/3 в браузере мы получаем правильный ответ 9, но значение не кэшируется.
Это связано с условием, которое мы использовали в аннотации @Cacheable , чтобы кэшировать только значения для чисел выше 10.
6. Заключение
В этом кратком руководстве мы показали, как настроить Ehcache с помощью Spring Boot.
Как всегда, код можно найти на GitHub .