Какую аннотацию, @Resource ( jsr250 ) или @Autowired (для Spring) следует использовать в DI?
Я успешно использовал как в прошлом, так @Resource(name="blah")
и@Autowired @Qualifier("blah")
Мой инстинкт состоит в том, чтобы придерживаться @Resource
тега, так как он был утвержден людьми jsr.
У кого-нибудь есть сильные мысли по этому поводу?
Ответы:
Весной до 3.0 не имеет значения, какой именно.
Весной 3.0 появилась поддержка стандартной ( JSR-330 ) аннотации
@javax.inject.Inject
- используйте ее с комбинацией@Qualifier
. Обратите внимание, что весна теперь также поддерживает@javax.inject.Qualifier
метааннотацию:Таким образом, вы можете иметь
или
А потом:
Это уменьшает использование строковых имен, которые могут быть написаны с ошибками и которые сложнее поддерживать.
Что касается исходного вопроса: оба без указания атрибутов аннотации выполняют внедрение по типу. Разница в следующем:
@Resource
позволяет указать имя внедренного компонента@Autowired
позволяет пометить его как необязательный.источник
foo
или конструкторSomeBean
сFoo
параметром?@Resource
и@Autowired
фактический ответ тот, который опубликовал @Ichthyo, я думаю, что этот вопрос должен быть обновлен.И
@Autowired
(или@Inject
) и@Resource
одинаково хорошо работают. Но есть концептуальная разница или разница в значении@Resource
значит достань мне известный ресурс по имени . Имя извлекается из имени аннотированного установщика или поля или берется из name-Parameter.@Inject
или@Autowired
попробуйте подключить подходящий другой компонент по типу .Итак, в основном это две совершенно разные концепции. К сожалению, в Spring -ализации
@Resource
есть встроенный запасной вариант, который срабатывает при сбое разрешения по имени. В этом случае он возвращается к@Autowired
разрешению -kind по типу. Хотя этот запасной вариант удобен, ИМХО он вызывает много путаницы, поскольку люди не знают о концептуальных различиях и склонны использовать их@Resource
для автопроводки на основе типов.источник
@Resource
аннотированное поле, а имя поля совпадает с идентификатором bean-компонента в контейнере, то Spring выдаст,org.springframework.beans.factory.BeanNotOfRequiredTypeException
если их типы различаются - это потому, что сначала bean-компоненты сопоставляются по имени в@Resource
аннотации, а не по типу. Но если имя свойства не совпадает с именем компонента, Spring связывает их по типу.@Autowire
вы не можете и не будете работать. Вам придется использовать@Resource
в этом случае.Основное отличие состоит в том,
@Autowired
что это весенняя аннотация. Принимая во внимание,@Resource
что определено JSR-250, как вы указали сами. Таким образом, последний является частью Java, тогда как первый характерен для Spring.Следовательно, вы правы, предлагая это в некотором смысле. Я нашел, что люди используют
@Autowired
с,@Qualifier
потому что это более сильно. Переход от одного каркаса к другому считается маловероятным, если не мифом, особенно в случае весны.источник
@Autowired
с@Qualifier
действительно является более мощным , чем стандартный JSR@Resource
аннотацию (думаю , необязательных зависимостей, например , с@Autowired(required=false)
. Вы не можете сделать это с@Resource
)Я хотел бы подчеркнуть один комментарий @Jules на этот ответ на этот вопрос. Комментарий содержит полезную ссылку: Spring Injection с @Resource, @Autowired и @Inject . Я призываю вас прочитать его полностью, однако вот краткое изложение его полезности:
Как аннотации выбирают правильную реализацию?
@Autowired
а также@Inject
@Resource
Какие аннотации (или комбинацию) я должен использовать для инъекции моих бобов?
Явно назовите свой компонент [@Component ("beanName")]
Использовать
@Resource
сname
атрибутом [@Resource (name = "beanName")]Почему я не должен использовать
@Qualifier
?Избегайте
@Qualifier
аннотаций, если вы не хотите создавать список похожих бинов. Например, вы можете пометить набор правил конкретной@Qualifier
аннотацией. Такой подход упрощает внедрение группы классов правил в список, который можно использовать для обработки данных.Инъекция бобов замедляет мою программу?
Сканирование определенных пакетов для компонентов
[context:component-scan base-package="com.sourceallies.person"]
. Хотя это приведет к большему количествуcomponent-scan
конфигураций, это уменьшит вероятность того, что вы добавите ненужные компоненты в свой контекст Spring.Ссылка: Spring Injection с помощью @Resource, @Autowired и @Inject
источник
Вот что я получил из справочного руководства Spring 3.0.x :
источник
@Autowired + @Qualifier будет работать только с пружинным DI, если вы хотите использовать другие DI в будущем. @Resource - хороший вариант.
Другое отличие, которое я нашел очень существенным, заключается в том, что @Qualifier не поддерживает динамическое связывание bean-компонентов, так как @Qualifier не поддерживает заполнитель, в то время как @Resource делает это очень хорошо.
Например: если у вас есть интерфейс с несколькими реализациями, как это
с @Autowired & @Qualifier вам нужно установить конкретную дочернюю реализацию, например
который не обеспечивает заполнитель, в то время как с @Resource вы можете поместить заполнитель и использовать файл свойств для внедрения конкретной дочерней реализации, например
где service.name устанавливается в файле свойств как
Надеюсь, что это помогает кому-то :)
источник
Оба они одинаково хороши. Преимущество использования Resource в будущем, если вы захотите использовать другую инфраструктуру DI, отличную от Spring, изменения в вашем коде будут намного проще. При использовании Autowired ваш код тесно связан с пружинами DI.
источник
Когда вы проанализируете критически из базовых классов этих двух аннотаций. Вы поймете следующие различия.
@Autowired
используетAutowiredAnnotationBeanPostProcessor
для внедрения зависимостей.@Resource
используетCommonAnnotationBeanPostProcessor
для внедрения зависимостей.Несмотря на то, что они используют разные классы постпроцессора, они ведут себя почти одинаково. Различия критически заключаются в путях их выполнения, которые я выделил ниже.
1. Соответствия по типу
2. Ограничения по квалификаторам
3. Соответствия по имени
1. Соответствия по имени
2. Соответствия по типу
3. Ограничения по квалификаторам (игнорируется, если совпадение найдено по имени)
источник
Если
@Resource
вы можете делать бин с самоинъекцией, это может понадобиться для запуска всей дополнительной логики, добавляемой постпроцессорами бинов, такими как транзакции или связанные с безопасностью вещи.С помощью Spring 4.3+
@Autowired
это тоже возможно.источник
@Resource
часто используется высокоуровневыми объектами, определенными через JNDI.@Autowired
или@Inject
будет использоваться более распространенными бобами.Насколько я знаю, это не спецификация и даже не соглашение. Это более логичный способ, которым стандартный код будет использовать эти аннотации.
источник
Как примечание здесь:
SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext
иSpringBeanAutowiringSupport.processInjectionBasedOnServletContext
не работает с@Resource
аннотацией. Итак, есть разница.источник