Разница между аннотациями @Autowired и @Resource

Обе аннотации — и @Autowired, и @Resource — используются для внедрения (инжекции) зависимостей. @Autowired является «родной» аннотацией Spring-а, а @Resource — это аннотация пакета javax.annotation. Между двумя аннотациями есть некоторые отличия, которые нужно учитывать :

  • @Resource внедряет ресурсы по jndi-имени ресурса, если явно не задать параметр name для аннотации, то за jndi будет взято: имя свойства, если инжекция через свойство, имя аргумента метода, если инжекция через метод; если аннотация «повешена» на класс, то параметр name должен быть указан явно.
  • У аннотации @Resource в приоритете инжекция бина по имени : когда происходит ситуация с несколькими кандидатами на внедрение, то если имя свойства соответствует названию бина, это будет более приоритетно по сравнению с уточнением @Qualifier (см. ниже) ; у @Autowired в приоритете инжекция бина по типу, то есть уточнение @Qualifier более приоритетно по сравнению с совпадением названия свойства и имени бина.
  • Аннотация @Resource неприменима к конструктору.
  • Аннотация @Autowired неприменима к классу.
  • У аннотации @Autowired есть булевский параметр required. Если его значение false, то в runtime не будет выброшено исключение в случае, если не найдены кандидаты для внедрения; в аннотации @Resource нет аналога.
  • Аннотация Spring-а @Qualifier используется только в связке с @Autowired. Для использования в связке с @Resource надо определить собственную аннотацию, которая в свою очередь проаннотирована Spring-овой аннотацией @Qualifier.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *