Подтвердить что ты не робот

Как я могу ввести зависимость Spring по идентификатору?

У меня есть несколько beans с тем же типом (BeanType). Как мне добавить их с помощью аннотации? Скажи:

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

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

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

4b9b3361

Ответ 1

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

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

Кстати, @Qualifier используется для обозначения beans по идентификатору для использования с @Autowired, например

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

где bean1 - это идентификатор bean, который должен быть введен.

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

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

и

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

Я предпочитаю @Resource, он более чистый (и не Spring -специфичный).