java inject config - @Resource vs @Autowired





5 Answers

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

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

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

spring @value bean

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

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

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




Я хотел бы подчеркнуть один комментарий от 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

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




С помощью @Resource вы можете делать самозавершение bean-боба, это может потребоваться для запуска дополнительной логики, добавленной процессорами bean post, такими как транзакционные или связанные с безопасностью вещи.

С Spring 4.3+ @Autowired также способен это сделать.




Когда вы критически анализируете базовые классы этих двух аннотаций. Вы поймете следующие различия.

@Autowired использует AutowiredAnnotationBeanPostProcessor для ввода зависимостей.
@Resource использует CommonAnnotationBeanPostProcessor для ввода зависимостей.

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

@Autowired / @Inject

1.Matches by Type
2. Ограничения по квалификациям
3.Matches by Name

@Resource

1.Matches by Name
2.Matches по типу
3.Restricts by Qualifiers (игнорируется, если совпадение найдено по имени)






Related