代码之家  ›  专栏  ›  技术社区  ›  Marcel Overdijk

将@ConfigurationProperties绑定到用于创建bean的生成器

  •  0
  • Marcel Overdijk  · 技术社区  · 7 年前

    我正在创建多个咖啡因缓存,比如:

    @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 回复  |  直到 7 年前
        1
  •  0
  •   Tyler Van Gorder    7 年前

    您可以执行类似于启动团队对数据源属性所做的操作:

    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();
        }
    
        2
  •  2
  •   Marcel Overdijk    7 年前

    对于未来的读者,这里是我使用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
    
        3
  •  -1
  •   Damith    7 年前

    @ConfigurationProperties(prefix = "cache.customer") 在你的上面 CacheConfig 类(一个配置类),在该类中可以使用 @EnableConfigurationProperties(CacheConfig.class) . 因此,现在可以自动将CacheConfig类连接到缓存类,并将其保存为缓存类中的私有属性。然后您可以通过builder使用这些配置,比如

    @Bean
    public Cache<String, Customer> customerCache() {
        return Caffeine.newBuilder()
                .maximumSize(cacheConfig.getMaximumSize())
                // other config settings
                .build(..);
    }
    
    推荐文章