Контейнеры компонент
В литературе существует большое количество определения термина компонент. Во избежании путаницы, определим компонент так как это удобно будет использовать в лекциях.
Компонент – это программный модуль, удовлетворяющий условиям контракта между ним и контейнером. Под контрактом, как правило, подразумевается некий базовый интерфейс и модель жизненного цикла.
Контейнер – это программный модуль, удовлетворяющий контракту по поддержанию жизненного цикла компонент(ов) которыми он управляет.
Примером компонента и контейнера может служить сервлет (Servlet) и контейнер сервлетов (Servlet Container), называемый так же web-контейнером или, часто, однако не совсем справедливо, web-сервером. Примером контейнера сервлетов может служить сервер Apache Tomcat.
Жизненный цикл компонента внутри контейнера определяется как набор состояний в которых может находиться компонент, переходы и условия переходов между состояниями. Обычно жизненный цикл задаётся в виде графа, вершины которого отражают все возможные состояния компонента а рёбра – переходы между состояниями.
Рассмотрим для примера граф состояний сервлета [15]. В процессе своей жизни сервлет может находиться в одном из перечисленных состояний:
- Загружен (Loaded) – сервер обнаруживает и загружает класс, отвечающий за реализацию сервлета и создаёт объект (экземпляр этого класса).
- Проинициализирован и готов (Ready to Service) – контейнер вызывает метод init(), в котором сервлет может выполнить одноразовую инициализацию, такую как, например, создание соединений с БД.
- Обслуживание запроса (Request Servicing) – сервер вызывает метод service() (или один из специализированных методов, таких как doGet(), doPost() и т.п.). Сервлет должен обработать запрос.
- Подготовлен к уничтожению (Ready to be Disposed) – сервер вызывает метод destroy() и освобождает все ссылки на экземпляр класса. После этого экземпляр класса уничтожается сборщиком мусора.
Рисунок 1. Жизненный цикл сервлета