在Spring为任何组件定义轮廓时,我们将其声明为 @Profile(value="Prod")。但是我想从属性文件中给出该值。可能吗?如果是,怎么办?
@Profile(value="Prod")
通过Spring的源代码,我得出的结论是您所要求的是不可能的。为了清楚起见,不可能让Spring ${property}内部进行评估@Profile。
${property}
@Profile
具体看看ProfileCondition哪个检查配置文件是否处于活动状态。
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))。
context.getEnvironment().acceptsProfiles(((String[]) value))
现在,如果你检查的来源AbstractEnvironment在那里acceptsProfiles居住,你会发现,在控制到达
AbstractEnvironment
acceptsProfiles
protected boolean isProfileActive(String profile) { validateProfile(profile); return doGetActiveProfiles().contains(profile) || (doGetActiveProfiles().isEmpty() && doGetDefaultProfiles().contains(profile)); }
它不尝试计算表达式,而是采用逐字字符串形式(还请注意,isProfileActive对字符串表达式的评估也无处不在)
isProfileActive
您可以在这里和这里找到我上面提到的代码。
另一个说明,我不确定为什么需要一个动态的配置文件名称。