聊聊 SpringBoot 中的两种占位符:@*@ 和 ${*}
前言
在 SpringBoot 项目中,我们经常会使用两种占位符(有时候还会混用),它们分别是:
-
@*@
-
${*}
如果我们上网搜索「SpringBoot 的占位符 @」,大部分答案会告诉你,SpringBoot 的默认占位符由 ${*}变成 @*@了,更好一点的答案会引用 SpringBoot官网 中的描述:
On the last point: since the default config files accept Spring style placeholders (
${…}
) the Maven filtering is changed to use@..@
placeholders (you can override that with a Maven propertyresource.delimiter
).
于是我们得到了答案,并心安理得地开始使用 @*@占位符。但如果有探索欲比较强的同学问起:Spring 中的占位符本来是 ${*},为啥 SpringBoot 中的占位符就变成 @*@了呢?有时候这两种占位符还能混用,这又是为什么呢?
今天,我们就来一探究竟,这两种占位符到底是如何实现的。
场景
首先要说明两种场景:
-
使用 @Value 注解注入属性时,只能使用 ${*} 占位符解析。
-
处理资源文件中的属性时,这两种占位符就有点意思了:它们既有可能都有效,还有可能都不生效,甚至你可以扩展自己的占位符!当然这一切都要看你是怎么配置的。下文会进行详细描述。
我们先简单看下第一种场景,@Value 注解的处理属于 Spring 核心框架逻辑,可以参见 PropertySourcesPlaceholderConfigurer 这个类,最终会执行 ${*} 占位符的解析。其中的冒号后面可以写默认值。