0

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 的整个文档,也许解决方案要简单得多
4

2 回答 2

1

你可以这样做:

@Value("#{ #this.getObject('bs.ozzy').song }")
于 2012-04-17T10:01:26.930 回答
0

我不确定上下文本身是否作为属性/引用公开。

如果它不是(仍在查找),您可以创建一个按名称查找 bean 的函数,所以它看起来像这样(或多或少):

@Value("#{byId('bs.ozzy').song}")

即使您可以通过方法通过 id 获取 bean 或使用字符串键进行映射查找,我对这个想法有点“meh”,因为您可能会失去一些 IDE 功能。

我想我更喜欢带有_(下划线)的命名空间。使用点搞砸了大多数期望点成为属性分隔符/方法调用的东西(这是很多东西)。

于 2011-11-12T17:50:10.477 回答