JSR-250 против JSR-330 для внедрения контекста приложения

Я вижу проблему с аннотацией @SRject JSR-330, не заполняющей ApplicationContext в моем bean-компоненте. При использовании аннотации JSR-250 @Resource она вводится правильно. Да, я знаю, что MyClass может реализовать ApplicationContextAware, но мне интересно, почему @Resource работает, а @Inject - нет. Я использую Spring-контекст версии 4.1.6.RELEASE и Java 8

Это работает:

@Named
public class MyClass {

  @Resource
  public ApplicationContext applicationContext;

...
}

Это имеет ApplicationContext как ноль

@Named
public class MyClass {

  @Inject
  public ApplicationContext applicationContext;

  ...
}

1 ответ

Было много путаницы, так как JSR-330 (Dependency Injection для Java) во главе с Родом Джонсоном (SpringSource) и Бобом Ли (Google Inc.) стал частью Java EE 6. JSR-330 очень упрощен. Он поставляется с несколькими аннотациями из пакета: javax.inject. Пакет содержит следующие элементы: Inject, Qualifier, Scope, Singleton, Named и Provider. Это определение базовой семантики внедрения зависимостей.

JSR-299 (контексты Java и внедрение зависимостей) с Гевином Кингом в качестве ведущего использует JSR-330 в качестве основы и значительно расширяет его с помощью модульности, сквозных аспектов (декораторов, перехватчиков), пользовательских областей действия или возможностей безопасного ввода типов. JSR-299 расположен поверх JSR-330.

Забавно видеть, что встроенный квалификатор @Named не рекомендуется и должен использоваться только для интеграции с устаревшим кодом:

"Использование @Named в качестве квалификатора точки внедрения не рекомендуется, за исключением случая интеграции с устаревшим кодом, который использует строковые имена для идентификации bean-компонентов". [3.11 Квалификатор @Named в точках впрыскивания, JSR-299 Spec, стр. 32]

источник http://www.adam-bien.com/roller/abien/entry/what_is_the_relation_between

Другие вопросы по тегам