Exemplo de Ehcache de inicialização de primavera
1. Visão geral
Vejamos um exemplo de uso do Ehcache com Spring Boot. Usaremos o Ehcache versão 3, pois fornece uma implementação de um gerenciador de cacheJSR-107.
O exemplo é um serviço REST simples que produz o quadrado de um número.
2. Dependências
org.springframework.boot
spring-boot-starter-web
2.1.1.RELEASE
org.springframework.boot
spring-boot-starter-cache
2.1.1.RELEASE
javax.cache
cache-api
1.1.0
org.ehcache
ehcache
3.6.2
3. Exemplo
Vamos criar um controlador REST simples que chama um serviço para elevar o número ao quadrado e retorna o resultado como uma 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));
}
}
Agora vamos criar o serviço.
Anotamos o método com@Cacheable para que o Spring cuide do cache. As a result of this annotation, Spring will create a proxy of the NumberService to intercept calls to the square method and call Ehcache.
Precisamos fornecer o nome do cache a ser usado e, opcionalmente, a chave. Também podemos adicionar uma condição para restringir o que é armazenado em 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;
}
}
Por fim, vamos criar nosso aplicativo Spring Boot principal:
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
4. Configuração de cache
Precisamos adicionar a anotação@EnableCaching do Spring a um bean Spring para que o gerenciamento de cache orientado por anotação do Spring seja habilitado.
Vamos criar uma classeCacheConfig:
@Configuration
@EnableCaching
public class CacheConfig {
}
A configuração automática do Spring encontra a implementação de Ehcache de JSR-107. No entanto, nenhum cache é criado por padrão.
Porque nem Spring nem Ehcache procuram por um arquivoehcache.xml padrão. Adicionamos a seguinte propriedade para informar ao Spring onde encontrá-lo:
spring.cache.jcache.config=classpath:ehcache.xml
Vamos criar um arquivoehcache.xml com um cache chamadosquareCache:
java.lang.Long
java.math.BigDecimal
30
com.example.cachetest.config.CacheEventLogger
ASYNCHRONOUS
UNORDERED
CREATED
EXPIRED
2
10
E vamos também adicionar o ouvinte de evento de cache que registra eventos de cacheCREATEDeEXPIRED:
public class CacheEventLogger
implements CacheEventListener
5. Em ação
Podemos usar o Maven para iniciar este aplicativo executandomvn spring-boot:run.
Em seguida, abra um navegador e acesse o serviço REST na porta 8080.
Se formos parahttp://localhost:8080/number/square/12, then vamos voltar\{“square”:144}, e no log 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 a mensagem de log do métodosquare deNumberService, e o eventoCREATED do EventLogger. If we then refresh the browser we will only see the following added to the log:
INFO [nio-8080-exec-2] c.b.cachetest.rest.NumberController : call numberService to square 12
A mensagem de log no métodosquare deNumberService não está sendo chamada. Isso nos mostra que o valor em cache está sendo usado.
If we wait 30 seconds for the cached item to expire and refresh the browser we’ll see an EXPIRED event, e o valor adicionado de volta ao 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
Se inserirmoshttp://localhost:8080/number/square/3 no navegador, obteremos a resposta correta de 9, mas o valor não é armazenado em cache.
Isso se deve à condição que usamos na anotação@Cacheable para armazenar somente valores de cache para números maiores que 10.
6. Conclusão
Neste tutorial rápido, mostramos como configurar o Ehcache com o Spring Boot.
Como sempre, o códigocan be found on GitHub.