我认为使用@Value注释和默认值时存在一些问题。我在变量上使用以下注释。我希望看到变量propAVar设置为propA的属性值但是,它总是设置为默认值-10
@Component
public class SomeClass {
@Value("${propA:-10}")
public String propAVar;
}
我在父和子上下文中使用PropertyPlaceholderConfigurer。子上下文具有上下文:component-scan元素,用于扫描SomeClass。在深入挖掘Spring代码时,我找到了以下问题所在的方法。
public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport implements ConfigurableBeanFactory {
//...
public String resolveEmbeddedValue(String value) {
String result = value;
for (StringValueResolver resolver : this.embeddedValueResolvers) {
if (result == null) {
return null;
}
result = resolver.resolveStringValue(result);
}
return result;
}
//...
}
看起来resolveEmbeddedValue将遍历所有embeddedValueResolvers并确定该属性的值。但是,如果我们定义一个默认值,它将在第一个embeddedValueResolvers中查找该属性,如果在那里找不到它,则返回默认值。它不应该通过所有解析器然后返回默认值吗?想提一下,没有默认值,这样可以正常工作。
如果有人可以帮助解释@Value的预期行为以及父子情境的默认值,那将会很棒。
上交叉发布