Spec-Zone .ru
спецификации, руководства, описания, API
|
|
|||||||||
ПРЕДЫДУЩИЙ СЛЕДУЮЩИЙ КЛАСС КЛАССА | ФРЕЙМЫ НИКАКИЕ ФРЕЙМЫ | ||||||||
СВОДКА: ТРЕБУЕМЫЙ | ДОПОЛНИТЕЛЬНЫЙ | ДЕТАЛЬ: ЭЛЕМЕНТ |
@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
. @Inject FieldModifiersopt Type VariableDeclarators;
Вводимые методы:
@Inject
.@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 что:
Например, пользователь мог бы использовать внешнюю конфигурацию, чтобы выбрать реализацию 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