javax.inject
Тип аннотации Вводит


@Target(value={METHOD,CONSTRUCTOR,FIELD})
@Retention(value=RUNTIME)
@Documented
public @interface Inject

Идентифицирует вводимых конструкторов, методы, и поля. Может примениться к статическим так же как членам экземпляра. У вводимого элемента может быть любой модификатор доступа (частный, частный на пакет, защищенный, общественность). Конструкторы вводятся сначала, сопровождаются полями, и затем методами. Поля и методы в суперклассах вводятся перед теми в подклассах. Упорядочивание инжекции среди полей и среди методов в том же самом class не определяется.

Вводимые конструкторы аннотируются @Inject и примите нуль или больше зависимостей как параметры. @Inject может примениться к самое большее одному конструктору на class.

@Inject ConstructorModifiersopt SimpleTypeName(FormalParameterListopt) Throwsopt ConstructorBody

@Inject является дополнительным для общедоступных, конструкторов без параметров, когда никакие другие конструкторы не присутствуют. Это позволяет инжекторам вызвать конструкторов по умолчанию.

@Injectopt Annotationsopt public SimpleTypeName() Throwsopt ConstructorBody

Вводимые поля:

@Inject FieldModifiersopt Type VariableDeclarators;

Вводимые методы:

@Inject MethodModifiersopt ResultType Identifier(FormalParameterListopt) Throwsopt MethodBody

Инжектор игнорирует результат введенного метода, но не -void возвратитесь типам позволяют поддерживать использование метода в других контекстах (объединение в цепочку метода стиля разработчика, например).

Примеры:

   public class Car {
     // Injectable constructor
     @Inject public Car(Engine engine) { ... }

     // Injectable field
     @Inject private Provider<Seat> seatProvider;

     // Injectable package-private method
     @Inject void install(Windshield windshield, Trunk trunk) { ... }
   }

Метод, аннотируемый @Inject это переопределяет другой метод, аннотируемый @Inject будет только введен однажды на инжекционный запрос на экземпляр. Метод без @Inject аннотация, которая переопределяет метод, аннотируемый @Inject не будет введен.

Инжекция элементов, аннотируемых @Inject требуется. В то время как вводимый элемент может использовать любой модификатор доступа (включая private), платформа или ограничения инжектора (как ограничения безопасности или нехватка отражательной поддержки) могли бы устранить инжекцию непубличных элементов.

Спецификаторы

Спецификатор может аннотировать вводимое поле или параметр и, объединенный с типом, идентифицировать реализацию, чтобы ввести. Спецификаторы являются дополнительными, и когда использующийся с @Inject в независимых от инжектора классах не больше, чем один спецификатор должен аннотировать единственное поле или параметр. Спецификаторы являются полужирными в следующем примере:

   public class Car {
     @Inject private @Leather Provider<Seat> seatProvider;

     @Inject void install(@Tinted Windshield windshield,
         @Big Trunk trunk) { ... }
   }

Если один вводимый метод переопределяет другого, параметры метода переопределения автоматически не наследовали спецификаторы от параметров переопределенного метода.

Вводимые Значения

Для данного типа T и дополнительного спецификатора, инжектор должен быть в состоянии ввести определенный пользователем class что:

  1. присвоение, совместимое с T и
  2. имеет вводимого конструктора.

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

Круговые Зависимости

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

   class A {
     @Inject B b;
   }
   class B {
     @Inject A a;
   }

Создавая экземпляр A, наивная реализация инжектора могла бы войти в бесконечный цикл, создающий экземпляр B установить на A, второй экземпляр A установить на B, второй экземпляр B установить на втором экземпляре A, и так далее.

Консервативный инжектор мог бы обнаружить круговую зависимость в, создают время и генерируют ошибку, в которой точке программист мог повредить круговую зависимость, вводя Provider<A> или Provider<B> вместо A или B соответственно. Вызов get() на провайдере непосредственно от конструктора или метода это было введено в поражения возможность провайдера разбить круговые зависимости. В случае метода или полевой инжекции, определяя контекст одной из зависимостей (использующий одноэлементный контекст, например) может также включить допустимому круговому отношению.

См. Также:
@Qualifier, Provider



Представьте ошибку или функцию

Авторское право © 2009-2011, Oracle Corporation и/или его филиалы. Все права защищены. Использование подвергается срокам действия лицензии.

Сгенерированный на 10-February-2011 12:41


Spec-Zone.ru - all specs in one place



free hit counter