2016-02-08 9 views
1

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

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

@Named 
public class MyClass { 

    @Resource 
    public ApplicationContext applicationContext; 

... 
} 

Это ApplicationContext утратившего

@Named 
public class MyClass { 

    @Inject 
    public ApplicationContext applicationContext; 

    ... 
} 

ответ

0

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

JSR-299 (Java контексты и Dependency Injection), с Gavin King, как свинца, использует JSR-330 в качестве основы и повышает ее значительно с модульности кросс аспекты резки (ПОМЕЩЕНИЙ, перехватчики), пользовательских областей, или типа безопасного впрыска. JSR-299 является слоем поверх JSR-330.

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

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

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