Search code examples
javaspringcaffeine-cache

Spring cache Caffeine integration without SpringBoot


I want to integrate Caffeine Cache in my Spring 5 application. I know that I need the CaffeineCacheManager, but i dont have the class. The only way i found is to add the SpringBoot Starter Cache package to the pom, but i dont want to use Spring Boot.

I have this Spring packages in my pom:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>5.2.8.RELEASE</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>5.2.8.RELEASE</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.2.8.RELEASE</version>
</dependency>

    <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.2.8.RELEASE</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-web -->
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-web</artifactId>
    <version>5.3.3.RELEASE</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-config -->
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-config</artifactId>
    <version>5.3.3.RELEASE</version>
</dependency>

Is any way to have CaffeineCacheManager class wihouth Spring Boot? Thanks.

Actually i am using this code to configure the cache:

@Bean
public CacheManager cacheManager() {
    
    SimpleCacheManager cacheManager = new SimpleCacheManager();
    cacheManager.setCaches(Arrays.asList(
        new ConcurrentMapCache(
                "categorias",
                Caffeine.newBuilder().expireAfterWrite(Duration.ofDays(1)).maximumSize(100).build().asMap(),
                false
        ),
        new ConcurrentMapCache(
                "ciudad",
                Caffeine.newBuilder().maximumSize(100).build().asMap(),
                false
        )
    ));
    
    return cacheManager;
}

Solution

  • The main spring cache implementation is located in spring-context dependency. You should only setup that cache manager and use @Cacheable annotation. For examples see: https://www.baeldung.com/spring-cache-tutorial Let me know if you need code example of connection Caffeine cache with spring cache mechanism.

    CaffeineCacheManager configuration:

    CaffeineCacheManager is located in

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
        <version>5.2.8.RELEASE</version>
    </dependency>
    

    And caffeine dependency:

    <dependency>
        <groupId>com.github.ben-manes.caffeine</groupId>
        <artifactId>caffeine</artifactId>
        <version>2.8.8</version>
    </dependency>
    

    Configuration:

    @Configuration
    @EnableCaching
    public class Config {
        @Bean
        public Caffeine<Object, Object> caffeineConfig() {
            return Caffeine.newBuilder().expireAfterWrite(60, TimeUnit.MINUTES);
        }
        @Bean
        public CacheManager cacheManager(Caffeine<Object, Object> caffeine) {
            CaffeineCacheManager caffeineCacheManager = new CaffeineCacheManager();
            caffeineCacheManager.setCaffeine(caffeine);
            return caffeineCacheManager;
        }
    }