Я не вижу разницы между двумя способами, @Qualifier всегда используется с @Autowired.
@Autowired
@Qualifier("alpha")
VS
@Resource(name="alpha")
Кто-нибудь может сообщить мне разницу? Спасибо!
Я не вижу разницы между двумя способами, @Qualifier всегда используется с @Autowired.
@Autowired
@Qualifier("alpha")
VS
@Resource(name="alpha")
Кто-нибудь может сообщить мне разницу? Спасибо!
@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-аннотация, которая семантически определена для идентификации конкретный целевой компонент по его уникальному имени, с объявленным типом не имеет значения для процесса сопоставления.
Я столкнулся с некоторыми проблемами с @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, но случайно имел другое имя переменной и столкнулся с этой проблемой.
Сообщите мне, есть ли какие-либо сомнения.
@Autowired - это старая школа Spring. @Resource - стандарт Java EE CDI. Spring обрабатывает оба (а также @Inject, что очень похоже) и делает почти то же самое в обеих ситуациях. Я бы рекомендовал @Resource, @Autowired был сделан до стандарта и, кажется, поддерживается в основном для обратной совместимости.