Контейнеры компонент

В литературе существует большое количество определения термина компонент. Во избежании путаницы, определим компонент так как это удобно будет использовать в лекциях.

Компонент – это программный модуль, удовлетворяющий условиям контракта между ним и контейнером. Под контрактом, как правило, подразумевается некий базовый интерфейс и модель жизненного цикла.

Контейнер – это программный модуль, удовлетворяющий контракту по поддержанию жизненного цикла компонент(ов) которыми он управляет.

Примером компонента и контейнера может служить сервлет (Servlet) и контейнер сервлетов (Servlet Container), называемый так же web-контейнером или, часто, однако не совсем справедливо, web-сервером. Примером контейнера сервлетов может служить сервер Apache Tomcat.

Жизненный цикл компонента внутри контейнера определяется как набор состояний в которых может находиться компонент, переходы и условия переходов между состояниями. Обычно жизненный цикл задаётся в виде графа, вершины которого отражают все возможные состояния компонента а рёбра – переходы между состояниями.

Рассмотрим для примера граф состояний сервлета [15]. В процессе своей жизни сервлет может находиться в одном из перечисленных состояний:

  • Загружен (Loaded) – сервер обнаруживает и загружает класс, отвечающий за реализацию сервлета и создаёт объект (экземпляр этого класса).
  • Проинициализирован и готов (Ready to Service) – контейнер вызывает метод init(), в котором сервлет может выполнить одноразовую инициализацию, такую как, например, создание соединений с БД.
  • Обслуживание запроса (Request Servicing) – сервер вызывает метод service() (или один из специализированных методов, таких как doGet(), doPost() и т.п.). Сервлет должен обработать запрос.
  • Подготовлен к уничтожению (Ready to be Disposed) – сервер вызывает метод destroy() и освобождает все ссылки на экземпляр класса. После этого экземпляр класса уничтожается сборщиком мусора.

 

Рисунок 1. Жизненный цикл сервлета