Dhanji 在他关于 Dependnecy Injection 的书中鼓励在命名 spring bean 时使用命名空间。
书中的引语:
我还强烈鼓励使用命名空间,例如“set.BinaryTree”和“set.HashTable”,它们比“binaryTreeSet”和“hashTableSet”更易于阅读和理解。命名空间对于您的键空间来说是一种更优雅、更自然的命名法,并且比分组的大写单词字符串更具可读性。
现在这听起来很合理。但从SPeL 开始,冲突就出现了。Ozzy 曾经在黑色安息日演奏,所以对于每个乐队成员,我会在 bean 名称中使用bs命名空间,如下所示:
<bean id="bs.ozzy"
class="sk.spring.idol.annotation.Instrumentalist"
p:song="Sabbath Bloody Sabbath" />
现在我有其他黑色安息日成员,他们将使用 SpEL 为歌曲名称注入价值。ozzy 播放的任何歌曲也将播放我的新成员(比如说托尼):
public class Instrumentalist implements Performer {
@Value("#{bs.ozzy.song}")
private String song;
// blabla other stuff, getters setters and so on
}
现在我会得到的是......
Expression parsing failed; nested exception is org.springframework.expression.spel.SpelEvaluationException: EL1008E:(pos 0): Field or property 'bs' cannot be found on object
现在呢?是否有某种方法可以将文本转义为“这是 bean 名称并且不将其评估为属性”?
笔记:
- 代码示例的灵感来自 Dhanji 的书。
- 我承认 - 我还没有阅读 SpEL 的整个文档,也许解决方案要简单得多