Leveraging Conditional Caching with Spring Boot 3.x

Master Spring Ter
3 min readJun 16, 2024

Caching is an essential technique to improve the performance of your application by storing frequently accessed data in memory, reducing the need for expensive operations like database queries. However, there are scenarios where you might want to conditionally enable or disable caching based on specific criteria, such as the current environment or a configuration property. In this tutorial, we’ll explore how to implement conditional caching in a Spring Boot 3.x application.

Step-by-Step Guide to Conditional Caching

We’ll use the following technologies:

  • Spring Boot 3.3.0
  • Spring Cache
  • Spring Expression Language (SpEL)

Setting Up the Project

Create a new Spring Boot project using Spring Initializr or your favorite IDE with the following dependencies:

  • Spring Web
  • Spring Cache
  • H2 Database (for demonstration purposes)

Configuring Caching

First, enable caching in your Spring Boot application by adding the @EnableCaching annotation to your main application class.

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;

@SpringBootApplication
@EnableCaching
public class ConditionalCachingApplication {

public static void main(String[] args) {
SpringApplication.run(ConditionalCachingApplication.class, args);
}
}

Creating the Cache Configuration

Next, we’ll create a configuration class to set up the cache manager. This example uses a simple in-memory cache.

import org.springframework.cache.CacheManager;
import org.springframework.cache.concurrent.ConcurrentMapCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class CacheConfig {

@Bean
public CacheManager cacheManager() {
return new ConcurrentMapCacheManager("items");
}
}

Defining a Service with Conditional Caching

Now, let’s create a service that fetches items from a database. We’ll use an in-memory H2 database for simplicity. The caching will be enabled or disabled based on a configuration property.

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

import java.util.Arrays;
import java.util.List;

@Service
public class ItemService {

@Value("${cache.enabled}")
private boolean cacheEnabled;

@Cacheable(value = "items", condition = "#root.target.cacheEnabled")
public List<String> getItems() {
simulateSlowService();
return Arrays.asList("Item1", "Item2", "Item3");
}

private void simulateSlowService() {
try {
Thread.sleep(3000L); // Simulate a slow service
} catch (InterruptedException e) {
throw new IllegalStateException(e);
}
}
}

in this example, the @Cacheable annotation uses SpEL to conditionally enable caching based on the cacheEnabled property.

Configuring the Application Properties

Add a property to application.properties to control the caching behavior.

# application.properties
cache.enabled=true

You can switch caching on or off by changing the value of cache.enabled.

Testing the Conditional Caching

Create a REST controller to expose an endpoint for testing.

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class ItemController {

@Autowired
private ItemService itemService;

@GetMapping("/items")
public List<String> getItems() {
return itemService.getItems();
}
}

Run your Spring Boot application and access the /items endpoint. The first request should take about 3 seconds (simulating a slow service), and subsequent requests should return instantly if caching is enabled.

Conclusion

Conditional caching in Spring Boot is a powerful way to optimize application performance while maintaining flexibility. By leveraging SpEL and configuration properties, you can easily control when and how caching is applied in your application. This technique is particularly useful in multi-environment setups where caching needs might vary.

Try integrating conditional caching into your Spring Boot projects to see the performance benefits firsthand!

This tutorial was generated using ChatGPT, specifically the Master Spring TER model. For more information, visit ChatGPT Master Spring TER.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

Master Spring Ter
Master Spring Ter

Written by Master Spring Ter

https://chatgpt.com/g/g-dHq8Bxx92-master-spring-ter Specialized ChatGPT expert in Spring Boot, offering insights and guidance for developers.

Responses (1)

Write a response