Как ввести зависимость Spring по идентификатору? - PullRequest
29 голосов
/ 10 января 2011

У меня есть несколько бобов одного типа (BeanType). Как мне ввести их по идентификатору с аннотацией? Скажи:

@Autowired @ID("bean1")
public void setBean( BeanType bean ) {
}

Но аннотации нет @ID.

Я нашел только @Qualifier, что означало бы, что мне придется дать все идентификаторы бобов и . Конечно, есть более простой способ?

1 Ответ

69 голосов
/ 10 января 2011

Самое простое решение - использовать @Resource

@Resource(name="bean1")
public void setBean( BeanType bean ) {
}

Кстати, @Qualifier - это , используемый для обозначения бобов по ID для использования с @Autowired, например,

@Autowired @Qualifier("bean1")
public void setBean( BeanType bean ) {
}

, где bean1 - идентификатор бина, который нужно ввести.

См. Руководство Spring :

При резервном совпадении имя компонента считается значением квалификатора по умолчанию. Таким образом, вы можете определить бин с идентификатором "main" вместо вложенного элемента квалификатора, что приведет к тому же результату сопоставления. Однако, хотя вы можете использовать это соглашение для обращения к определенным bean-компонентам по имени, @Autowired в основном относится к внедрению по типу с дополнительными семантическими квалификаторами. Это означает, что значения квалификатора, даже с отступлением имени компонента, всегда имеют сужающую семантику в наборе совпадений типов; они семантически не выражают ссылку на уникальный идентификатор компонента.

и

Если вы намерены выражать инъекцию на основе аннотации по имени, не используйте в первую очередь @Autowired, даже если технически способны ссылаться на имя компонента с помощью значений @Qualifier. Вместо этого используйте аннотацию JSR-250 @Resource, которая семантически определена для идентификации конкретного целевого компонента по его уникальному имени, причем объявленный тип не имеет значения для процесса сопоставления.

Я предпочитаю @Resource, он чище (и не зависит от Spring).

...