@ConditionalOnExpression 是 Spring Framework 中用于条件性加载 Bean 的注解,它允许你基于一个 Spring Expression Language (SpEL) 表达式的结果来决定是否加载某个 Bean。在你的例子中,注解中的表达式依据一个配置属性来决定是否启用相关功能。
注解详解
@ConditionalOnExpression("'${cache.clean.enabled:false}'.equals('true')")
这个注解中的表达式主要做了以下几件事:
-
${cache.clean.enabled:false}
:这是一个 Spring 配置属性占位符。1.1
${cache.clean.enabled}
表示从配置文件(如application.properties
或 application.yml
)中获取cache.clean.enabled
的值。
1.2 如果没有找到cache.clean.enabled
属性,则使用默认值 false。 -
'true'.equals(...)
:这是一个字符串比较操作,它检查属性值是否为'true'
。
2.1 如果配置属性的值为'true'
,表达式结果为 true,则注解标注的 Bean 会被加载。
2.2 如果配置属性的值不是 ‘true’,则表达式结果为 false,该 Bean 将不会被加载。
示例说明:
假设你在 application.properties
中有以下配置:
cache.clean.enabled=true
相关代码
package cn.keking.config;
import cn.keking.service.cache.CacheService;
import cn.keking.utils.KkFileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
/**
* @auther: chenjh
* @since: 2019/6/11 7:45
*/
@Component
@ConditionalOnExpression("'${cache.clean.enabled:false}'.equals('true')")
public class SchedulerCleanConfig {
private final Logger logger = LoggerFactory.getLogger(SchedulerCleanConfig.class);
private final CacheService cacheService;
public SchedulerCleanConfig(CacheService cacheService) {
this.cacheService = cacheService;
}
private final String fileDir = ConfigConstants.getFileDir();
//默认每晚3点执行一次
@Scheduled(cron = "${cache.clean.cron:0 0 3 * * ?}")
public void clean() {
logger.info("Cache clean start");
cacheService.cleanCache();
KkFileUtils.deleteDirectory(fileDir);
logger.info("Cache clean end");
}
}
那么,@ConditionalOnExpression
中的表达式将解析为 'true'.equals('true')
,因此,相关的 Bean 会被加载。
如果没有配置这个属性,默认值是 false
,则表达式解析为 'false'.equals('true')
,相关的 Bean 不会被加载。