Spring Boot Ehcache 2 Caching Example Configuration
Ehcache is an open source, standards-based cache that boosts performance, offloads your database, and simplifies scalability. It’s the most widely-used Java-based cache because it’s robust, proven, full-featured, and integrates with other popular libraries and frameworks. Ehcache scales from in-process caching, all the way to mixed in-process/out-of-process deployments with terabyte-sized caches.
In this tutorial we demonstrate how to implement Ehcache 2 Caching configured using Spring Boot.
Project Structure
Our project structure looks like this.
Maven Dependencies
We use Apache Maven to manage our project dependencies. To start, add the following dependencies to your project. When using ehcache add the net.sf.ehcache:ehcache dependency.
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.memorynotfound.springboot.caching</groupId> <artifactId>ehcache2</artifactId> <version>1.0.0-SNAPSHOT</version> <url>https://memorynotfound.com</url> <name>Spring Boot - ${project.artifactId}</name> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.4.RELEASE</version> </parent> <dependencies> <!-- Spring Framework Caching Support --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
Ehcache 2 Caching Configuration
In this example configuration we’re creating a simple in memory cache. Create a ehcache.xml file in the src/main/resources folder. When the in memory cache isn’t sufficient for you, don’t worry. Ehcache has a lot of options you can tweak. For more advanced configurations, read the documentation.
<?xml version="1.0" encoding="UTF-8"?> <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.ehcache.org/ehcache.xsd" updateCheck="true" monitoring="autodetect" dynamicConfig="true"> <cache name="instruments" maxElementsInMemory="100" eternal="false" overflowToDisk="false" timeToLiveSeconds="300" timeToIdleSeconds="0" memoryStoreEvictionPolicy="LFU" transactionalMode="off"> </cache> </ehcache>
Configure Caching Properties
We can configure the location of the ehcache.xml in spring-boot by setting the following configuration property in the application.yml file.
# application.yml spring: cache: ehcache: config: classpath:ehcache.xml
The equivalent application.properties file.
# application.properties spring.cache.ehcache.config=classpath:ehcache.xml
Ehcache 2 Caching Service
By annotating the play method using the @Cacheable annotation the result of the subsequent invocations will be cached. The @CacheEvict(allEntries=true) clears all the entries from the cache. The @CacheConfig(cachenames="instruments") registers every method annotated with the spring framework caching annotations with the specified cache.
package com.memorynotfound.springboot; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.cache.annotation.*; import org.springframework.stereotype.Service; @Service @CacheConfig(cacheNames = "instruments") public class MusicService { private static Logger log = LoggerFactory.getLogger(MusicService.class); @CacheEvict(allEntries = true) public void clearCache(){} @Cacheable(condition = "#instrument.equals('trombone')") public String play(String instrument) { log.info("Executing: " + this.getClass().getSimpleName() + ".play(\"" + instrument + "\");"); return "paying " + instrument + "!"; } }
Bootstrap Ehcache 2 Caching Application
We can simply enable the caching by annotating the class with @EnableCaching.
package com.memorynotfound.springboot; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.EnableCaching; @EnableCaching @SpringBootApplication public class Application implements CommandLineRunner { private static Logger log = LoggerFactory.getLogger(Application.class); @Autowired private MusicService musicService; @Autowired private CacheManager cacheManager; public static void main(String[] args) throws Exception { SpringApplication.run(Application.class, args); } @Override public void run(String... args) throws Exception { log.info("Spring Boot Ehcache 2 Caching Example Configuration"); log.info("using cache manager: " + cacheManager.getClass().getName()); musicService.clearCache(); play("trombone"); play("guitar"); play("trombone"); play("bass"); play("trombone"); } private void play(String instrument){ log.info("Calling: " + MusicService.class.getSimpleName() + ".play(\"" + instrument + "\");"); musicService.play(instrument); } }
Running Spring Boot Application
We can run the spring boot application using the following maven command.
mvn spring-boot:run
Console Output
The previous application prints the following output to the console.
. ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v1.5.4.RELEASE) INFO - Spring Boot Ehcache 2 Caching Example Configuration INFO - using cache manager: org.springframework.cache.ehcache.EhCacheCacheManager INFO - Calling: MusicService.play("trombone"); INFO - Executing: MusicService.play("trombone"); INFO - Calling: MusicService.play("guitar"); INFO - Executing: MusicService.play("guitar"); INFO - Calling: MusicService.play("trombone"); INFO - Calling: MusicService.play("bass"); INFO - Executing: MusicService.play("bass"); INFO - Calling: MusicService.play("trombone");
Download
From:一号门
COMMENTS