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