@Produces
@Chosen
@RequestScoped
public Coder getCoder() {
switch (coderType) {
case TEST:
return new TestCoderImpl();
case SHIFT:
return new CoderImpl();
default:
return null;
}
}
Java Platform, Enterprise Edition (Java EE) 8 Учебник по Java EE |
Назад | Вперёд | Содержание |
Метод-производитель генерирует объект, который затем может быть инъецирован. Как правило, методы-производители используются в следующих ситуациях:
Когда вы хотите инъецировать объект, который не является бином
Когда конкретный тип объекта для инъецирования может изменяться во время выполнения
Когда объект требует некоторой пользовательской инициализации, которую не выполняет конструктор бина
Для получения дополнительной информации о методах-производителях см. Инъецирование объектов с использованием методов-производителей.
Поле-производитель является более простой альтернативой методу-производителю. Это поле бина, которое генерирует объект. Его можно использовать вместо простого get-метода. Поля-производители особенно полезны для объявления ресурсов Java EE, таких как источники данных, ресурсы JMS и ссылки на веб-сервисы.
Метод-производитель или поле-производитель помечаются аннотацией javax.enterprise.inject.Produces
.
Метод-производитель может позволить вам выбрать реализацию компонента во время выполнения, а не во время разработки или развёртывания. Например, в примере, описанном в Пример producermethods: использование метода producer-а для выбора реализации компонента, Managed-бин определяет следующий метод источника:
@Produces
@Chosen
@RequestScoped
public Coder getCoder() {
switch (coderType) {
case TEST:
return new TestCoderImpl();
case SHIFT:
return new CoderImpl();
default:
return null;
}
}
Здесь getCoder
фактически становится get-методом, а когда свойство coder
инъецируется с тем же квалификатором и аннотациями, что и метод, используется выбранная версия интерфейса.
@Inject
@Chosen
@RequestScoped
Coder coder;
Важно указать квалификатор: он сообщает CDI, какой Coder
инъецировать. Без этого реализация CDI не сможет выбирать между CoderImpl
, TestCoderImpl
и вернувшейся getCoder
и отменит развёртывание, сообщив пользователю о неоднозначности зависимости.
Общее использование поля-производителя заключается в создании объекта, такого как JDBC DataSource
или Java Persistence API EntityManager
(для получения дополнительной информации см. главу 40 «Введение в API персистентности Java» ). Затем объект может управляться контейнером. Например, вы можете создать квалификатор @UserDatabase
и затем объявить поле-производитель для entity manager-а следующим образом:
@Produces
@UserDatabase
@PersistenceContext
private EntityManager em;
Квалификатор @UserDatabase
можно использовать, когда вы инъецируете объект в другой компонент, RequestBean
, в другом месте приложения:
@Inject
@UserDatabase
EntityManager em;
...
Пример producermethods: использование полей-производителей для создания ресурсов показывает, как использовать поля-производители для генерации EntityManager-а. Вы можете использовать аналогичный механизм для инъецирования объектов @Resource
, @EJB
или @WebServiceRef
.
Чтобы свести к минимуму зависимость от инъецирования ресурса, укажите поле-производитель для ресурса в одном месте приложения, а затем инъецируйте объект в нужное вам место приложения.
Вы можете использовать метод-производитель или поле-производитель, чтобы сгенерировать объект, который необходимо удалить после завершения его работы. Если это так, вам нужен соответствующий метод закрытия, аннотированный @Disposes
. Например, вы можете закрыть EntityManager следующим образом:
public void close(@Disposes @UserDatabase EntityManager em) {
em.close();
}
Метод закрытия вызывается автоматически по окончании контекста (в данном случае в конце диалога, поскольку RequestBean
имеет область видимости диалога), а параметр в методе close
получает объект, созданный полем-производителем.
Назад | Вперёд | Содержание |