[Java] @Resource vs @Autowired



Answers

Оба @Autowired (или @Inject ) и @Resource работают одинаково хорошо. Но есть концептуальная разница или разница в значении

  • @Resource означает получить мне известный ресурс по имени . Имя извлекается из имени аннотированного сеттера или поля, или оно берется из имени-параметра.
  • @Inject или @Autowired попытайтесь @Autowired другой подходящий компонент по типу .

Итак, в основном это два совершенно разных понятия. К сожалению, Spring-реализация @Resource имеет встроенный @Resource который @Resource когда сбой разрешения по @Resource не выполняется. В этом случае он возвращается к @Autowired @Autowired -kind. Хотя это резервное копирование удобно, ИМХО вызывает много путаницы, потому что люди не знают концептуальной разницы и склонны использовать @Resource для @Resource на основе типов.

Question

Какую аннотацию, @Resource ( jsr250 ) или @Autowired (Spring specific) следует использовать при использовании DI?

Я успешно использовал оба в прошлом, @Resource(name="blah") и @Autowired @Qualifier("blah")

Мой инстинкт заключается в том, чтобы придерживаться тега @Resource поскольку он был ратифицирован людьми jsr. У кого-нибудь есть сильные мысли по этому поводу?




@Resource часто используется объектами высокого уровня, определенными через JNDI. @Autowired или @Inject будут использоваться более распространенными компонентами.

Насколько я знаю, это не спецификация и даже не конвенция. Это более логичный способ использования этих аннотаций в стандартном коде.




Я хотел бы подчеркнуть один комментарий от Jules об этом ответе на этот вопрос. В комментарии добавлена ​​полезная ссылка: blogs.sourceallies.com/2011/08/… . Я рекомендую вам прочитать его полностью, однако вот краткое изложение его полезности:

Как аннотации выбирают правильную реализацию?

@Autowired и @Inject

  1. Матчи по типу
  2. Ограничения по квалификациям
  3. Матчи по имени

@Resource

  1. Матчи по имени
  2. Матчи по типу
  3. Ограничивает квалификаторы (игнорируется, если совпадение найдено по имени)

Какие аннотации (или комбинации) следует использовать для инъекции моих бобов?

  1. Явным образом назовите ваш компонент [@Component ("beanName")]

  2. Используйте @Resource с атрибутом name [@Resource (name = "beanName")]

Почему я не должен использовать @Qualifier ?

Избегайте аннотаций @Qualifier если вы не хотите создавать список похожих компонентов. Например, вы можете пометить набор правил с помощью специальной аннотации @Qualifier . Этот подход упрощает введение группы классов правил в список, который может использоваться для обработки данных.

Заставляет ли бобин замедлять мою программу?

Сканировать определенные пакеты для компонентов [context:component-scan base-package="com.sourceallies.person"] . Хотя это приведет к большему количеству конфигураций component-scan это уменьшит вероятность того, что вы добавите ненужные компоненты в контекст Spring.

Ссылка: blogs.sourceallies.com/2011/08/…




@Autowired + @Qualifier будет работать только с весной DI, если вы хотите использовать некоторые другие DI в будущем @Resource - хороший вариант.

Другая разница, которую я нашел очень значимой, - @Qualifier не поддерживает динамическую компоновку фасонов, поскольку @Qualifier не поддерживает местозаполнитель, в то время как @Resource делает это очень хорошо.

Например: если у вас есть интерфейс с несколькими реализациями, подобными этому

interface parent {

}
@Service("actualService")
class ActualService implements parent{

}
@Service("stubbedService")
class SubbedService implements parent{

}

с @Autowired & @Qualifier вам нужно установить конкретную реализацию ребенка, например

@Autowired
@Qualifier("actualService") or 
@Qualifier("stubbedService") 
Parent object;

который не предоставляет placeholder, а с помощью @Resource вы можете поместить placeholder и использовать файл свойства для инъекции конкретной реализации дочернего элемента, например

@Resource(name="${service.name}")
Parent object;  

где service.name устанавливается в файле свойств как

#service.name=actualService
 service.name=stubbedService

Надеюсь, что кто-то поможет :)




В качестве примечания здесь: SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext и SpringBeanAutowiringSupport.processInjectionBasedOnServletContext НЕ работает с аннотацией @Resource . Итак, есть разница.




Links