Java Platform, Enterprise Edition (Java EE) 8
Учебник по Java EE

Назад Вперёд Содержание

Начало работы

Контексты и инъецирование зависимостей (CDI) позволяют вашим объектам автоматически предоставлять свои зависимости вместо того, чтобы создавать их или получать в качестве параметров. CDI также управляет жизненным циклом этих зависимостей.

Например, рассмотрим следующий сервлет:

@WebServlet("/cdiservlet")
public class NewServlet extends HttpServlet {
    private Message message;

    @Override
    public void init() {
        message = new MessageB();
    }

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response)
                  throws IOException {
        response.getWriter().write(message.get());
    }
}

Этот сервлет нуждается в объекте, который реализует интерфейс Message:

public interface Message {
    public String get();
}

Сервлет инстанцирует себе объект следующего класса:

public class MessageB implements Message {
    public MessageB() { }

    @Override
    public String get() {
        return "message B";
    }
}

Используя CDI, этот сервлет может объявить свою зависимость от объекта Message и автоматически инъецировать его во время выполнения CDI. Новый код сервлета следующий:

@WebServlet("/cdiservlet")
public class NewServlet extends HttpServlet {
    @Inject private Message message;

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response)
                  throws IOException {
        response.getWriter().write(message.get());
    }
}

Среда выполнения CDI ищет классы, которые реализуют интерфейс Message, находит класс MessageB, инстанцирует его объект и инъецирует его в сервлет во время выполнения. Для управления жизненным циклом нового объекта среде выполнения CDI необходимо знать, какой должна быть область видимости объекта. В этом примере сервлету нужен только объект для обработки HTTP-запроса. Затем объект может быть собран сборщиком мусора. Это указывается с помощью аннотации javax.enterprise.context.RequestScoped:

@RequestScoped
public class MessageB implements Message { ... }

Для получения дополнительной информации об областях видимости смотрите Использование областей видимости.

Класс MessageB является бином CDI. Бины CDI — это классы, которые CDI может создавать, управлять и автоматически инъецировать для удовлетворения зависимостей других объектов. Почти любой класс Java может управляться и инъецироваться с помощью CDI. Для получения дополнительной информации о бинах см. О бинах. Файл JAR или WAR, содержащий бин CDI, является архивом бина. Для получения дополнительной информации об упаковке архивов бинов см. Настройка приложения CDI в этой главе и Упаковка приложений CDI в главе 27 «Контексты и инъецирование зависимостей в Java EE»: дополнительные темы ".

В этом примере MessageB — единственный класс, который реализует интерфейс Message. Если приложение имеет несколько реализаций интерфейса, CDI предоставляет механизмы, которые могут использоваться при выборе реализации для инъецирования. Для получения дополнительной информации см. Использование квалификаторов в этой главе и Использование альтернатив в приложениях CDI в главе 27 «Контексты и инъецирование зависимостей в Java EE: дополнительные темы».


Назад Вперёд Содержание
Логотип Oracle  Copyright © 2017, Oracle и/или её дочерних компаний. Все права защищены. Версия перевода 1.0.5 (Java EE Tutorial — русскоязычная версия)