Привязка @ConfigurationProperties к компоновщику, используемому для создания компонента

Я создаю несколько кэшей кофеина, как:

@Bean
public Cache<String, Customer> customerCache() {
    return Caffeine.newBuilder()
            .maximumSize(10_000)
            // other config settings
            .build(..);
}

Теперь я хотел бы использовать что-то вроде @ConfigurationProperties(prefix = "cache.customer") установить параметры конфигурации строителя.

Где свойство приложения cache.customer.maximum-size: 1000 существует.

Есть ли что-то умное, что я могу сделать, чтобы отобразить @ConfigurationProperties для кофеин строителя?

3 ответа

Решение

Вы можете сделать что-то похожее на то, что сделала команда загрузки с DataSourceProperties:

https://github.com/spring-projects/spring-boot/blob/master/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceProperties.java

Вы связываете свои свойства в класс свойств, а затем используете метод этого класса свойств для создания вашего компоновщика.

Вот другой пример, где мы привязываем свойства и источник данных к одному корню:

    @Bean
    @ConfigurationProperties("datasource.task")
    public DataSourceProperties taskDataSourceProperties() {
        return new DataSourceProperties();
    }

    @Bean(name = {"taskDataSource"}, destroyMethod="")
    @ConfigurationProperties("datasource.task")
    @ConditionalOnMissingBean(name="taskDataSource")
    public DataSource taskDataSource() {
        return taskDataSourceProperties().initializeDataSourceBuilder().build();
    }

Для будущих читателей вот код, который я использовал для использования Spring Boot @ConfigurationProperties настроить кофеин кеш:

import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;

/**
 * Base class for configuration of a Caffeine {@link Cache}
 */
public class CaffeineCacheProperties {

    private Integer maximumSize;

    // TODO: Add additional properties + getters and setters.

    public Integer getMaximumSize() {
        return maximumSize;
    }

    public void setMaximumSize(final Integer maximumSize) {
        this.maximumSize = maximumSize;
    }

    public Caffeine initializeCacheBuilder() {
        Caffeine cacheBuilder = Caffeine.newBuilder();
        if (maximumSize != null) {
            cacheBuilder.maximumSize(maximumSize);
        }
        // TODO: Configure additional properties.
        return cacheBuilder;
    }
}

,

import com.github.benmanes.caffeine.cache.Cache;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * The cache {@link Configuration} class.
 */
@Configuration
public class CacheConfig {

    @Bean
    @ConfigurationProperties("cache.customer")
    public CaffeineCacheProperties customerCacheProperties() {
        return new CacheProperties();
    }

    @Bean
    public Cache<String, Customer> customerCache() {
        return customerCacheProperties().initializeCacheBuilder().build();
    }

    // TODO: Add other caches.
}

А затем добавьте свойство приложения, например:

cache.customer.maximum-size: 1000

Ты можешь использовать @ConfigurationProperties(prefix = "cache.customer") на вершине вашего CacheConfig класс (класс конфигураций), где вы можете легко связать свойства приложения с вашим классом Cache, используя @EnableConfigurationProperties(CacheConfig.class), Теперь вы можете автоматически связать класс CacheConfig с вашим классом Cache и сохранить его как частный атрибут в вашем классе кеша. И тогда вы можете использовать эти конфигурации через строитель, как

@Bean
public Cache<String, Customer> customerCache() {
    return Caffeine.newBuilder()
            .maximumSize(cacheConfig.getMaximumSize())
            // other config settings
            .build(..);
}
Другие вопросы по тегам