Идентифицирует инжектируемые конструкторы, методы и поля. Может применяться как к статическим, так и к экземплярным членам. Инжектируемый член может иметь любой модификатор доступа (private, package-private, protected, public). Сначала инжектируются конструкторы, затем поля, и в конце методы. Поля и методы в суперклассах инжектируются до тех, что в подклассах. Порядок инжекции между полями и методами в одном и том же классе не определен.
Инжектируемые конструкторы аннотируются с @Inject и принимают ноль или более зависимостей в качестве аргументов. @Inject может применяться к не более чем одному конструктору в классе.
@Inject
ConstructorModifiers SimpleTypeName(FormalParameterListopt) Throws ConstructorBody @Inject является необязательным для публичных конструкторов без аргументов, когда нет других конструкторов. Это позволяет инжекторам вызывать конструкторы по умолчанию.
@Injectopt Annotationsopt public SimpleTypeName() Throwsopt ConstructorBody
Инжектируемые поля: аннотируются с @Inject. не являются final. могут иметь любой допустимый имя.
@Inject FieldModifiersopt Type VariableDeclarators; Инжектируемые методы: аннотируются с @Inject. не являются абстрактными. не объявляют своих собственных параметров типа. могут возвращать результат. могут иметь любой допустимый имя. принимают ноль или более зависимостей в качестве аргументов.@Inject MethodModifiersopt ResultType Identifier(FormalParameterListopt) Throwsopt MethodBody Инжектор игнорирует результат инжектированного метода, но допускает непустые типы возврата для поддержки использования метода в других контекстах (цепочка методов в стиле конструктора, например). Примеры:
public class Car {
// Инжектируемый конструктор
@Inject public Car(Engine engine) { ... }
// Внедряемое поле
@Inject private Provider<Seat> seatProvider;
// Внедряемый пакетный метод
@Inject void install(Windshield windshield, Trunk trunk) { ... }
}
Метод, аннотированный @Inject, который переопределяет другой метод, аннотированный @Inject, будет внедрен только один раз на каждую запрос к внедрению для каждого экземпляра. Метод без аннотации @Inject, который переопределяет метод, аннотированный @Inject, не будет внедрен. Внедрение членов, аннотированных @Inject, обязательно. Хотя внедряемый член может использовать любой модификатор доступа (включая private), ограничения платформы или внедрения (например, ограничения безопасности или отсутствие поддержки рефлексии) могут препятствовать внедрению необщедоступных членов. Квалификаторы Квалификатор может аннотировать внедряемое поле или параметр и, вместе с типом, идентифицировать реализацию для внедрения. Квалификаторы являются необязательными, и при использовании с @Inject в классах, независимых от внедрения, не более одного квалификатора должен аннотировать одно поле или параметр.Квалификаторы выделены жирным шрифтом в следующем примере: public class Car { @Inject private @Leather Provider seatProvider; @@Inject void install(@Tinted Windshield windshield, @Big Trunk trunk) { . . . } } Если один инжектируемый метод переопределяет другой, параметры переопределяющего метода автоматически не наследуют квалификаторы параметров переопределяемого метода. Инжектируемые Значения Для данного типа T и опционального квалификатора, инжектор должен быть способен инжектировать пользовательский класс, который: совместим с присваиванием с T и имеет инжектируемый конструктор. Например, пользователь может использовать внешнюю конфигурацию для выбора реализации T. Кроме того, какие значения будут инжектированы, зависит от реализации инжектора и его конфигурации. Циклические Зависимости Обнаружение и разрешение циклических зависимостей оставлено как упражнение для реализации инжектора. Циклическая зависимость между двумя конструкторами является очевидной проблемой, но также может быть циклическая зависимость между инжектируемыми полями или методами: класс A { @Inject B b; } класс B { @Inject A a; } При создании экземпляра класса A, простая реализация инжектора может войти в бесконечный цикл, создавая экземпляр класса B для установки в A, второй экземпляр класса A для установки в B, второй экземпляр класса B для установки во второй экземпляр класса A и так далее.Консервативный инжектор может обнаружить циклическую зависимость во время сборки и сгенерировать ошибку, в результате чего программист может разорвать циклическую зависимость, инжектировав Provider или Provider вместо A или B соответственно. Прямое вызов get() на провайдере из конструктора или метода, в который он был инжектирован, препятствует способности провайдера разрывать циклические зависимости. В случае инжектирования метода или поля, использование области видимости одного из зависимостей (например, синглтон области видимости) также может позволить валидную циклическую зависимость.
@Target(value={METHOD,CONSTRUCTOR,FIELD}) @Retention(value=RUNTIME) @Documented public @interface InjectСм. также: @Qualifier, Provider
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )