@ConditionalOnProperty注解控制配置文件是否生效

该博客介绍了如何使用@Configuration和@ConditionalOnProperty注解来控制配置生效,基于应用属性动态加载配置。同时展示了如何配置Redis作为缓存管理器,包括RedisTemplate的配置和缓存序列化策略,以及启用缓存@EnableCaching的条件。

这个注解能够控制某个configuration是否生效。具体操作是通过其两个属性name以及havingValue来实现的,其中name用来从application.properties中读取某个属性值,如果该值为空,则返回false;如果值不为空,则将该值与havingValue指定的值进行比较,如果一样则返回true;否则返回false。如果返回值为false,则该configuration不生效;为true则生效。

@Configuration
//如果synchronize在配置文件中并且值为true
@ConditionalOnProperty(name = "synchronize", havingValue = "true")
public class SecondDatasourceConfig {

    @Bean(name = "SecondDataSource")
    @Qualifier("SecondDataSource")
    @ConfigurationProperties(prefix = "spring.second.datasource")
    public DataSource jwcDataSource() {
        return DataSourceBuilder.create().build();
    }
}

@EnableCaching  //启用缓存注解
@Configuration
@ConditionalOnProperty(name = "current.cache.enable", havingValue = "true")
public class RedisConfig extends CachingConfigurerSupport {

    /**
     * 注入生成key的策略(作用于注解注解缓存)
     */
    @Bean(name = "customKeyGenerator")
    public KeyGenerator keyGenerator() {
        return new RedisCacheKeyGenerator();
    }

    @Primary
    @Bean
    public CacheManager cacheManager(RedisConnectionFactory factory) {
        // 对象的序列化
        RedisSerializationContext.SerializationPair<Object> valueSerializationPair
                = RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer());
        // 全局redis缓存过期时间。默认1天
        RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofDays(1))
//                .serializeKeysWith()
                .serializeValuesWith(valueSerializationPair);

        return new RedisCacheManager(RedisCacheWriter.nonLockingRedisCacheWriter(factory), redisCacheConfiguration);
    }

    /**
     * RedisTemplate配置
     * @param factory redis链接工厂
     * @return RedisTemplate
     */
    @Bean(name = "redisTemplate")
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        RedisSerializer<String> redisSerializer = new StringRedisSerializer();

        // 设置序列化,key采用redisSerializer,value采用jackson2JsonRedisSerializer
        template.setConnectionFactory(factory);
        template.setKeySerializer(redisSerializer);
        template.setValueSerializer(jackson2JsonRedisSerializer());
        template.setHashKeySerializer(redisSerializer);
        template.setHashValueSerializer(jackson2JsonRedisSerializer());
        template.afterPropertiesSet();
        return template;
    }


    private Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer() {
        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
        jackson2JsonRedisSerializer.setObjectMapper(objectMapper());
        return jackson2JsonRedisSerializer;
    }

    private ObjectMapper objectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);

        // 解决jackson2无法反序列化LocalDateTime的问题
        objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
        objectMapper.registerModule(new JavaTimeModule());
        return objectMapper;
    }


}

### @ConditionalOnProperty 注解的使用指南和示例 #### 1. 注解的基本用途 `@ConditionalOnProperty` 是 Spring Boot 提供的一个条件注解,用于根据配置文件中的属性值决定是否创建某个 Bean 或启用某个配置类。它的核心作用是通过属性值控制组件的加载行为,从而实现灵活的配置管理。例如,可以通过配置文件中的开关来启用或禁用某些功能模块[^3]。 #### 2. 注解的语法结构 `@ConditionalOnProperty` 的基本语法如下: ```java @ConditionalOnProperty( prefix = "前缀", name = "属性名", havingValue = "指定值", matchIfMissing = false ) ``` - `prefix`:指定属性的前缀。 - `name`:指定属性的名称。 - `havingValue`:指定属性需要匹配的值。如果属性值与 `havingValue` 相等,则条件成立。 - `matchIfMissing`:当属性不存在时的默认行为。如果设置为 `true`,则在属性缺失时条件成立;如果设置为 `false`,则在属性缺失时条件不成立。 #### 3. 控制 Bean 的创建 `@ConditionalOnProperty` 可以直接用于 `@Bean` 注解的方法上,用于控制某个 Bean 的创建。例如,以下代码展示了如何根据配置文件中的 `notification.service` 属性值决定是否创建 `notificationSender` Bean: ```java @Bean(name = "emailNotification") @ConditionalOnProperty(prefix = "notification", name = "service") public NotificationSender notificationSender() { return new EmailNotification(); } ``` 在这个示例中,只有当配置文件中存在 `notification.service` 属性时,才会创建 `notificationSender` Bean[^4]。 #### 4. 控制配置类的生效 `@ConditionalOnProperty` 还可以用于 `@Configuration` 注解的类上,以控制整个配置类是否生效。例如,以下代码展示了如何根据配置文件中的 `feature.enabled` 属性值决定是否启用某个配置类: ```java @Configuration @ConditionalOnProperty(prefix = "feature", name = "enabled", havingValue = "true") public class FeatureConfiguration { // 配置内容 } ``` 在这个示例中,只有当配置文件中 `feature.enabled` 的值为 `true` 时,`FeatureConfiguration` 类才会生效[^2]。 #### 5. 实际应用场景 `@ConditionalOnProperty` 的典型应用场景包括: - **功能开关**:通过配置文件控制某些功能模块的启用或禁用。例如,可以根据环境配置启用或禁用调试日志。 - **环境配置**:根据不同的环境(如开发、测试、生产)加载不同的配置。例如,可以为开发环境加载内存数据库配置,为生产环境加载实际的数据库连接配置。 - **按需加载**:根据业务需求动态加载某些组件。例如,只有在启用某个功能时才加载相关的服务类。 ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值