Spring: бины, использующие пространства имен в идентификаторах, конфликтуют с SPeL - PullRequest
0 голосов
/ 12 ноября 2011

Дханджи в своей книге об инъекциях зависимостей поощряет использование пространств имен при именовании весенних бобов.

Цитата из книги:

Я также настоятельно рекомендую использоватьпространств имен, например, «set.BinaryTree» и «set.HashTable», которые лучше читать и понимать, чем «binaryTreeSet» и «hashTableSet».Пространства имен являются более элегантной и естественной номенклатурой для вашего ключевого пространства и в высшей степени удобнее для чтения, чем строки сгруппированных заглавных слов.

Теперь это звучит разумно.Но с SPeL конфликты возникают.Когда-то Оззи играл в Black Sabbath, поэтому для каждого участника группы я буду использовать bs namespance в имени бина, например:

<bean id="bs.ozzy"
    class="sk.spring.idol.annotation.Instrumentalist" 
    p:song="Sabbath Bloody Sabbath" />

Теперь у меня есть другой участник black sabbath, которыйбудет иметь введенное значение для имени песни, используя SpEL.Любая песня, которую играет Оззи, также сыграет моего нового участника (скажем, Тони):

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

Что теперь ?Есть ли способ избежать текста как «это имя бина и не оценивать его как свойство»?

Примечания:

  • Пример кода вдохновлен книгой Дханджи.
  • Признаюсь - я не прочитал всю документацию по SpEL, возможно, решение намного проще

Ответы [ 2 ]

1 голос
/ 17 апреля 2012

Вы можете сделать это:

@Value("#{ #this.getObject('bs.ozzy').song }")
0 голосов
/ 12 ноября 2011

Я не уверен, выставлен ли сам контекст как свойство / ссылка.

Если это не так (все еще выглядит), вы можете просто создать функцию, которая ищет бин по имени, чтобы она выглядела так (более или менее):

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

Даже если бы вы могли получить bean-компонент по идентификатору через метод или поиск по карте с помощью строкового ключа, я в некотором роде "меха" об этой идее, потому что вы потенциально потеряете некоторые функции IDE.

Я думаю, что предпочел бы пространство имен с _ (подчеркивание). Использование многоточия приводит в порядок все, что ожидает, что точки будут вызовом разделителя / метода (а это очень много).

...