Главная » Spring » Инициализация и уничтожение компонентов Spring

0

При создании компонента может потребоваться выполнить неко- торые операции по его инициализации, чтобы привести его в при- годное для использования состояние. Аналогично, перед уничтоже- нием и удалением компонента из контейнера, может потребоваться выполнить некоторые заключительные операции. Для этой цели фреймворк Spring позволяет определять методы управления жиз- ненным циклом компонента.

Чтобы определить методы, вызываемые при создании и уничто- жении компонента, просто добавьте в элемент <bean> атрибуты init- method и/или destroy-method. Атрибут init-method определяет метод, вызываемый сразу после создания экземпляра компонента. Анало- гично атрибут destroy-method определяет метод, вызываемый непо- средственно перед удалением компонента из контейнера.

Для иллюстрации представим, что у нас имеется Java-класс Auditorium, представляющий концертный зал, где проводится кон- курс талантов. Вероятно, класс Auditorium должен иметь массу осо- бенностей, но пока сосредоточимся на двух из них, играющих важ- ную роль в начале и в конце выступлений: включение и выключение освещения.

Для поддержки этих важных операций в классе Auditorium могут иметься методы turnOnLights()  и turnOffLights():

public class Auditorium {

public  void  turnOnLights()  {

}

public  void  turnOffLights()  {

}

}

Детали реализации методов turnOnLights() и turnOffLights() не имеют большого значения. Но большое значение имеет тот факт, что метод turnOnLights() должен вызываться перед выступлениями, а метод turnOffLights() – по их окончании. Для решения этой задачи добавим атрибуты init-method и destroy-method в объявление компо- нента auditorium:

<bean  id="auditorium" class="com.springinaction.springidol.Auditorium" init-method="turnOnLights"

destroy-method="turnOffLights"/>

В соответствии с этим объявлением сразу после создания эк- земпляра компонента auditorium будет вызван метод turnOnLights(), включающий освещение зала. А непосредственно перед удалением компонента из контейнера будет вызван метод turnOffLights(), вы- ключающий освещение.

Интерфейсы InitializingBean и DisposableBean. Фреймворк Spring обеспечивает альтернативный способ определения методов инициали- зации и уничтожения компонентов – реализовать в классе компонента интерфейсы InitializingBean  и DisposableBean. Компонентам, реализую- щим эти интерфейсы, предоставляется  возможность управлять  эта- пами своего жизненного цикла, и они обрабатываются фреймворком Spring особым образом. Интерфейс InitializingBean  объявляет метод afterPropertiesSet(), который играет роль метода инициализации. А ин- терфейс DisposableBean объявляет метод destroy(), который вызывается перед удалением компонента из контекста приложения.

Главным преимуществом использования этих интерфейсов управления жизненным циклом является автоматическое определение контейнером Spring компонентов, реализующих эти интерфейсы, без каких-либо внеш- них настроек. А недостаток состоит в образовании тесной связи между прикладными компонентами и Spring API. Именно по этой причине для реализации операций инициализации и уничтожения компонентов я ре- комендую использовать атрибуты init-method и destroy-method. Единствен- ное, где могут пригодиться интерфейсы управления жизненным цик- лом, – при разработке компонентов собственного фреймворка, которые будут использоваться исключительно в контейнере Spring.

Методы инициализации и уничтожения по умолчанию

Если в файле определения контекста необходимо определить множество компонентов с методами инициализации или уничтоже- ния, имеющими одинаковые имена, можно не объявлять атрибуты init-method и destroy-method для каждого отдельного компонента, а до- бавить атрибуты default-init-method  и default-destroy-method  в элемент

<beans>:

<?xml  version="1.0"  encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd" default-init-method="turnOnLights"

default-destroy-method="turnOffLights">   …

</beans>

Атрибут default-init-method определяет метод инициализации для всех компонентов в данном определении контекста. Аналогично атрибут default-destroy-method определяет общий метод уничтожения для всех компонентов в определении контекста. В данном случае фреймворку Spring предписывается инициализировать все компо- ненты, описанные в файле определения контекста, вызовом метода turnOnLights() и уничтожать их вызовом метода turnOffLights() (если эти методы существуют – иначе ничего не произойдет).

Источник:   Уоллс К., Spring в действии. – М.: ДМК Пресс, 2013. – 752 с.: ил.

По теме:

  • Комментарии