.. _app-service: Сервисы приложения ================== Сервисом является глобальный экземпляр класса, который реализует определенный интерфейс. Сервисы в приложении доступны через интерфейс, который они реализуют. В качестве интерфейса могут быть использованы обычные интерфейсы (interface), абстрактные классы, обычные классы. Сервисы создаются в процессе загрузки приложения и существуют все время жизни приложения. Сервисы в приложении описываются как дочерние узлы узла ``service``. Имя узла - это имя класса-интерфейса сервиса. Значение атрибута ``class`` - это класс реализатор сервиса: .. code-block:: xml Доступ к сервисам осуществляется через метод ``App.service(interfaceClass)``, где в качестве параметра передается интерфейсный класс сервиса: .. code-block:: java ErrorFormatter fmt = getApp().service(ErrorService.class).getErrorFormatter(); Активация сервисов ------------------ Если сервис реализует интерфейсы ``jandcode.app.IActivate``, ``jandcode.app.IAfterActivate``, или ``jandcode.app.IBeforeActivate`` то он активируется в процессе :ref:`активации приложения `. Пример 1 -------- Создадим некий простой сервис: .. code-block:: java package myapp; // абстрактный интерфейс сервиса public abstract class TimerService implements IActivate { public abstract void startTimer(); public abstract long stopTimer(); } // реализация сервиса public class TimerServiceImpl extends TimerService { private long saveTimer; public void startTimer() { saveTimer = System.currentTimeMillis(); } public long stopTimer() { return System.currentTimeMillis() - saveTimer; } public void activate() throws Exception { startTimer(); } } Далее сервис нужно описать в конфигурации (rt-файле): .. code-block:: xml что эквивалентно: .. code-block:: xml Используем сервис: .. code-block:: java getApp().service(TimerService.class).startTimer() Пример 2. Без абстрактного интерфейса ------------------------------------- Создадим простой сервис без абстрактного интерфейса. Фактически просто глобальный экземпляр объекта: .. code-block:: java package myapp; // интерфейс и реализация сервиса public class TimerService implements IActivate { private long saveTimer; public void startTimer() { saveTimer = System.currentTimeMillis(); } public long stopTimer() { return System.currentTimeMillis() - saveTimer; } public void activate() throws Exception { startTimer(); } } Далее сервис нужно описать в конфигурации (rt-файле). В качестве имени и атрибута ``class`` указываем один и тот же класс: .. code-block:: xml Пример 3. Замена реализации сервиса ----------------------------------- Создадим альтернативную реализацию сервиса, описанного в предыдущем примере. .. code-block:: java package myapp2; import myapp.*; // интерфейс и реализация сервиса public class TimerServiceWithLog extends TimerService { protected static Log log = LogFactory.getLog(TimerServiceWithLog.class); public long stopTimer() { long a = super.stopTimer(); log.info("timer stopped with: "+a); return a; } } Далее сервис нужно описать в конфигурации (rt-файле). Заменяем существующему сервису атрибут ``class``: .. code-block:: xml