Обе аннотации — и @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.