Интеграция Spring cache с кофеином без SpringBoot

#java #spring #caffeine-cache

#java #spring #кофеин-кэш

Вопрос:

Я хочу интегрировать кэш кофеина в свое приложение Spring 5. Я знаю, что мне нужен CaffeineCacheManager, но у меня нет класса. Единственный способ, который я нашел, — добавить пакет SpringBoot Starter Cache в pom, но я не хочу использовать Spring Boot.

У меня есть эти весенние пакеты в моем 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>
 

Есть ли какой-либо способ иметь класс CaffeineCacheManager с загрузкой Spring? Спасибо.

На самом деле я использую этот код для настройки кэша:

 @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;
}
 

Ответ №1:

Основная реализация spring cache находится в зависимости от spring-контекста. Вы должны только настроить этот диспетчер кэша и использовать аннотацию @Cacheable. Примеры см.: https://www.baeldung.com/spring-cache-tutorial Дайте мне знать, если вам нужен пример кода для подключения кеша кофеина с механизмом spring cache.

Конфигурация CaffeineCacheManager:

CaffeineCacheManager находится в

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

И зависимость от кофеина:

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

Конфигурация:

 @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;
    }
}
 

Комментарии:

1. Привет, спасибо за ответ. Я обновил вопрос с помощью кода, который я использую для настройки кэша. Проблема в том, что с помощью CaffeineCacheManager я не могу использовать конфигурацию по умолчанию. SimpleCacheManager очень прост. Спасибо.

2. Большое спасибо. поддержка spring-context была библиотекой, которой мне не хватало.

3. Отлично! В любое время!

4. Работает ли это в версии Spring 4?