Привязка @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:
Вы связываете свои свойства в класс свойств, а затем используете метод этого класса свойств для создания вашего компоновщика.
Вот другой пример, где мы привязываем свойства и источник данных к одному корню:
@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(..);
}