CDI поддерживает непосредственное введение поля, введение параметра метода инициализатора и введение параметра конструктора.Из спецификации CDI 1.0:
3.7.Конструкторы бина
Когда контейнер создает экземпляр класса бина, он вызывает конструктор бина .Конструктор бина является конструктором класса бина.
Приложение может напрямую вызывать конструкторы бина.Однако, если приложение создает экземпляр компонента напрямую, контейнер не передает параметры конструктору;возвращенный объект не привязан ни к какому контексту;контейнер не вводит никаких зависимостей;и жизненный цикл нового экземпляра не управляется контейнером.
3.7.1.Объявление конструктора бина
Конструктор бина может быть идентифицирован аннотированием конструктора @Inject
.
@SessionScoped
public class ShoppingCart implements Serializable {
private User customer;
@Inject
public ShoppingCart(User customer) {
this.customer = customer;
}
public ShoppingCart(ShoppingCart original) {
this.customer = original.customer;
}
ShoppingCart() {}
...
}
@ConversationScoped
public class Order {
private Product product;
private User customer;
@Inject
public Order(@Selected Product product, User customer) {
this.product = product;
this.customer = customer;
}
public Order(Order original) {
this.product = original.product;
this.customer = original.customer;
}
Order() {}
...
}
Если класс бина не объявляет конструктор явно, используя @Inject
, конструкторкоторый не принимает никаких параметров, является конструктором компонента.
Если класс компонента содержит несколько аннотированных конструкторов @Inject
, контейнер автоматически обнаруживает проблему и обрабатывает ее как ошибку определения.
Еслиу конструктора бина есть аннотированный параметр @Disposes
или @Observes
, контейнер автоматически обнаруживает проблему и обрабатывает ее как ошибку определения.
Конструктор бина может иметь любое количество параметров.Все параметры конструктора бина являются точками внедрения.