Контексты и инъецирование зависимостей (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 { ... }