A while ago I wrote about method caching in Java using Ehcache Annotations for Spring. However, Spring 3.1 release, among many enhancements, brings native support for method caching with so-called cache abstraction. The main usage scenario of cache abstraction is to reduce the number of expensive executions and/or slow methods returning the same result for given parameters. The usage of Spring cache abstraction consists of two aspects: cache declaration and configuration. Spring provides many ways for declaring and configuring caching in an application: annotation-based, XML-based or mixed. In this article I will create an application that utilizes cache using Java-based approach. The example used in this article is a bit modified project taken from the original article.
Create a new web project
To create a project we use spring-mvc-quickstart Maven2 archetype that can be found here: spring-mvc-quickstart-archetype. After installing the archetype in your local repository we run the following command to create new Spring 3.1 MVC project:
Once the project is created it may be imported to Eclipse/STS using “Import Existing Maven Projects”.
Spring cache abstraction currently supports two cache storages: JDK ConcurrentMap-based Cache and Ehcache-based Cache that will be used in this example. In order to use Ehcache-based Cache storage in our application we need to add appropriate dependency on Ehcache in POM file:
Our application is configured via Spring @Configuration classes and the cache configuration will be configured the same way thanks to @EnableCaching annotation that enables Spring annotation-driven cache management capability to the application.
To finish the configuration we need to create ehcache.xml file that configures Ehcache. The file should be in the classpath (according to the above configuration), so we place it in src/main/resources:
Now it’s time to add caching capabilities to the application. We declare caching on MessageRepository by setting the following rules:
use cache with name messageCache for caching messages for invocations of findByRecipient(String)
use cache with name messagesCache for caching messages for invocations of findAll()
remove all elements from both caches after the invocation of createMessage(Message)
To declare method cacheable we use the org.springframework.cache.annotation.Cacheable annotation – method or type level annotation indicating the method or multiple methods can be cached. To invalidate the cache we use org.springframework.cache.annotation.CacheEvict annotation:
Note that both caches used in the above example appeared ehcache.xml file shown in previous section. To quickly see the result of the method caching we may create a @Controller that calls our repository methods:
Please note that the method will be cached using default key – meaning that the method parameter is considered as a key and default cache condition – meaning that the method is always cached. Consult API docs for more details regarding these attributes. When calling the method for the first time we may observe in logs that the method was actually executed (hibernate.show_sql property is set to true):
Hibernate:select message0_.id asid0_,message0_.body asbody0_,message0_.recipient asrecipient0_ from Message message0_ where message0_.recipient=?
Another call will not execute the method, instead its result will be returned from cache. And that’s it!
Spring cache abstraction brings to developers the possibility of method caching in applications with a minimal code changes and simple configuration to control the cache behavior. Comparing to already mentioned Ehcache Annotations for Spring it has one big advantage in my opinion: Spring provides an abstraction, which makes it extensible to support more cache managers in future or to provide your own ones.
We process cookies and make them available to Google Analytics (a service provided by Google, Inc.) to improve the performance of the website, to learn your preferences about using it and to tailor it to your needs. The data will be anonymised before being transmitted. If you do not agree to this, you may disable cookies in your browser. If you do not change your browser settings, you accept the fact that it saves cookies.