小编典典

将@Profile批注与属性占位符值一起使用

spring-boot

在Spring为任何组件定义轮廓时,我们将其声明为 @Profile(value="Prod")。但是我想从属性文件中给出该值。可能吗?如果是,怎么办?


阅读 341

收藏
2020-05-30

共1个答案

小编典典

通过Spring的源代码,我得出的结论是您所要求的是不可能的。为了清楚起见,不可能让Spring
${property}内部进行评估@Profile

具体看看ProfileCondition哪个检查配置文件是否处于活动状态。

class ProfileCondition implements Condition {

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        if (context.getEnvironment() != null) {
            MultiValueMap<String, Object> attrs = metadata.getAllAnnotationAttributes(Profile.class.getName());
            if (attrs != null) {
                for (Object value : attrs.get("value")) {
                    if (context.getEnvironment().acceptsProfiles(((String[]) value))) {
                        return true;
                    }
                }
                return false;
            }
        }
        return true;
    }

}

肉是context.getEnvironment().acceptsProfiles(((String[]) value))

现在,如果你检查的来源AbstractEnvironment在那里acceptsProfiles居住,你会发现,在控制到达

protected boolean isProfileActive(String profile) {
    validateProfile(profile);
    return doGetActiveProfiles().contains(profile) ||
            (doGetActiveProfiles().isEmpty() && doGetDefaultProfiles().contains(profile));
}

它不尝试计算表达式,而是采用逐字字符串形式(还请注意,isProfileActive对字符串表达式的评估也无处不在)

您可以在这里这里找到我上面提到的代码。


另一个说明,我不确定为什么需要一个动态的配置文件名称。

2020-05-30