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

Разница между @Qualifier и @Resource

Я не вижу разницы между двумя способами, @Qualifier всегда используется с @Autowired.

@Autowired
@Qualifier("alpha")

VS

@Resource(name="alpha")

Кто-нибудь может сообщить мне разницу? Спасибо!

4b9b3361

Ответ 1

@Autowired может использоваться отдельно. Если он используется один, он будет подключен по типу. Поэтому возникают проблемы, если в контейнере объявлено более одного bean того же типа, что и @Autowired не знает, какой beans использовать для ввода. В результате используйте @Qualifier вместе с @Autowired, чтобы выяснить, какой из beans должен быть действительно подключен, указав имя bean (проводное по имени)

@Resource также подключается по имени. Поэтому, если @Autowired используется вместе с @Qualifier, это то же самое, что и @Resource.

Разница заключается в том, что @Autowired и @Qualifier - аннотация spring, а @Resource - стандартная аннотация java (от JSR-250). Кроме того, @Resource поддерживает только поля и инсталляцию setter, а @Autowired поддерживает вставки полей, установщиков, конструкторов и методов с несколькими аргументами.

Предлагается использовать @Resource для полей и инъекции установщика. Придерживайтесь @Qualifier и @Autowired для конструктора или метода с несколькими аргументами.

Смотрите this:

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

Ответ 2

Я столкнулся с некоторыми проблемами с @Autowired, а затем начал использовать @Qualifier, и я наконец смог узнать, когда использовать @Autowired с @Qualifier, когда определены несколько beans того же типа.

Предположим, вы определили 2 beans того же типа, но разные значения:

<bean id="appContext1" class="com.context.AppContext">
     <constructor-arg value="abc" />
<bean/>
<bean id="appContext2" class="com.context.AppContext">
     <constructor-arg value="ABC" />
<bean/>

Затем, если вы просто пытаетесь использовать @Autowire, тогда вы должны использовать то же имя переменной, что и для имени bean, иначе оно выдаст ошибку, если обнаружено несколько типов.

@Autowired
AppContext appContext;

В приведенном выше примере использования вы должны использовать Qualifier.

@Autowired
@Qualifier("appContext1")
AppContext appContext;

Вместо этого, если вы используете имя переменной так же, как имя bean, вы можете исключить использование @Qualifier.

@Autowired
AppContext appContext1;

Я всегда использовал имя переменной так же, как имя bean, но случайно имел другое имя переменной и столкнулся с этой проблемой.

Сообщите мне, есть ли какие-либо сомнения.

Ответ 3

@Autowired - это старая школа Spring. @Resource - стандарт Java EE CDI. Spring обрабатывает оба (а также @Inject, что очень похоже) и делает почти то же самое в обеих ситуациях. Я бы рекомендовал @Resource, @Autowired был сделан до стандарта и, кажется, поддерживается в основном для обратной совместимости.