属性从哪里读、谁覆盖谁?@Value 的占位符缺失时为什么有时报错有时不报?字符串怎么转布尔?中文配置为什么乱码?这篇在 Spring Framework 7.0.9 上逐项验证。
PropertySource 的顺序(先找前面的):[systemProperties, systemEnvironment, class path resource [app.properties]] app.name = from -D system property(系统属性、环境变量、app.properties 里都可能有) only.file = only in file;MY_NAME(环境变量)用 my.name 取 = 来自环境变量;用 MY_NAME 取 = 来自环境变量 addFirst 一个 MapPropertySource 之后 app.name = 运行时 addFirst 加的 再用 addLast 加一个同名键:app.name = from -D system property(addLast 排在最后,赢不了);late.only = 晚到的
系统属性在环境变量之前,@PropertySource 加载的文件排在后面;addFirst / addLast 控制新加的属性源在前还是在后。
resolvePlaceholders("${nope}") = ${nope}(宽松,保持原样)
resolveRequiredPlaceholders("${nope}") → PlaceholderResolutionException: Could not resolve placeholder 'nope' in value "${nope}"
${nope:默认} → 默认;${who} → spring;嵌套默认值 greeting → hello spring
嵌套占位符:url=${url.${region}},region=cn → ${url} = https://cn.example宽松解析保持原样,严格解析抛异常;支持默认值和嵌套。
nopspc:@Value("${missing.key}") = [${missing.key}];带默认值的 = [默认值];@Value("${app.name}") = [from app.properties];SpEL #{systemProperties['user.language']} = [en]
pspc:启动失败 PlaceholderResolutionException: Could not resolve placeholder 'missing.key' in value "${missing.key}"没有 PropertySourcesPlaceholderConfigurer 时缺失键会被原样注入,有了才会启动失败。
字符串 → Boolean:{true=true, yes=true, on=true, 1=true, false=false, no=false, off=false, 0=false, TRUE=true, abc=ConversionFailedException}
port 作为 Integer = 8080;不存在的键 getProperty("x", Integer.class) = null;带默认值 = 9090;getRequiredProperty 不存在的键 → IllegalStateException: Required key 'x' not foundyes、on、1 都被当作 true;转换不了抛 ConversionFailedException。
default:title = [䏿æ é¢] 字符数 12(期望“中文标题”4 个字符) utf8:title = [中文标题] 字符数 4(期望“中文标题”4 个字符)
@PropertySource 读 .properties 默认不是 UTF-8,中文要加 encoding。
ignore:启动成功 noignore:FileNotFoundException: class path resource [nope.properties] cannot be opened because it does not exist
默认启动失败,ignoreResourceNotFound = true 才会跳过。