Жизненный цикл бобов Spring легко понять. Когда создается экземпляр компонента, может потребоваться выполнить некоторую инициализацию, чтобы перевести его в работоспособное состояние. Точно так же, когда боб больше не требуется и вынимается из контейнера, может потребоваться некоторая очистка.
Хотя существуют списки действий, которые происходят за кулисами между моментом создания компонента и его уничтожением, в этой главе будут обсуждаться только два важных метода обратного вызова жизненного цикла компонента, которые необходимы во время инициализации компонента и его уничтожения.
Чтобы определить настройку и демонтаж для bean-компонента, мы просто объявляем <bean-компонент> с параметрами initmethod и / или destroy-method . Атрибут init-method указывает метод, который должен вызываться в bean-компоненте сразу после его создания. Аналогично, destroymethod определяет метод, который вызывается непосредственно перед удалением компонента из контейнера.
Инициализация обратных вызовов
Интерфейс org.springframework.beans.factory.InitializingBean указывает один метод —
void afterPropertiesSet() throws Exception;
Таким образом, вы можете просто реализовать описанный выше интерфейс, а инициализацию можно выполнить внутри метода afterPropertiesSet () следующим образом:
public class ExampleBean implements InitializingBean { public void afterPropertiesSet() { // do some initialization work } }
В случае метаданных конфигурации на основе XML вы можете использовать атрибут init-method, чтобы указать имя метода, имеющего пустую подпись без аргументов. Например —
<bean id = "exampleBean" class = "examples.ExampleBean" init-method = "init"/>
Ниже приводится определение класса —
public class ExampleBean { public void init() { // do some initialization work } }
Уничтожение колбэков
Интерфейс org.springframework.beans.factory.DisposableBean указывает один метод —
void destroy() throws Exception;
Таким образом, вы можете просто реализовать описанный выше интерфейс, а завершающая работа может быть выполнена внутри метода destroy () следующим образом:
public class ExampleBean implements DisposableBean { public void destroy() { // do some destruction work } }
В случае метаданных конфигурации на основе XML вы можете использовать атрибут destroy-method, чтобы указать имя метода, имеющего пустую подпись без аргументов. Например —
<bean id = "exampleBean" class = "examples.ExampleBean" destroy-method = "destroy"/>
Ниже приводится определение класса —
public class ExampleBean { public void destroy() { // do some destruction work } }
Если вы используете IoC-контейнер Spring в среде без веб-приложений; например, в среде рабочего стола с расширенным клиентом вы регистрируете перехват выключения в JVM. Это гарантирует плавное завершение работы и вызывает соответствующие методы уничтожения для ваших одноэлементных компонентов, чтобы освободить все ресурсы.
Рекомендуется не использовать обратные вызовы InitializingBean или DisposableBean, потому что конфигурация XML дает большую гибкость с точки зрения именования вашего метода.
пример
Давайте создадим рабочую среду Eclipse и предпримем следующие шаги для создания приложения Spring:
меры | Описание |
---|---|
1 | Создайте проект с именем SpringExample и создайте пакет com.tutorialspoint в папке src в созданном проекте. |
2 | Добавьте необходимые библиотеки Spring с помощью параметра « Добавить внешние JAR-файлы», как описано в главе « Пример Hello World» . |
3 | Создайте классы Java HelloWorld и MainApp в пакете com.tutorialspoint . |
4 | Создайте файл конфигурации Beans Beans.xml в папке src . |
5 | Последний шаг — создать содержимое всех файлов Java и файла конфигурации Bean и запустить приложение, как описано ниже. |
Вот содержимое файла HelloWorld.java —
package com.tutorialspoint; public class HelloWorld { private String message; public void setMessage(String message){ this.message = message; } public void getMessage(){ System.out.println("Your Message : " + message); } public void init(){ System.out.println("Bean is going through init."); } public void destroy() { System.out.println("Bean will destroy now."); } }
Ниже приводится содержание файла MainApp.java . Здесь вам нужно зарегистрировать метод hookSdowndownStoreShutdownHook (), который объявлен в классе AbstractApplicationContext. Это обеспечит постепенное отключение и вызовет соответствующие методы уничтожения.
package com.tutorialspoint; import org.springframework.context.support.AbstractApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class MainApp { public static void main(String[] args) { AbstractApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml"); HelloWorld obj = (HelloWorld) context.getBean("helloWorld"); obj.getMessage(); context.registerShutdownHook(); } }
Ниже приведен файл конфигурации Beans.xml, необходимый для методов init и destroy:
<?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"> <bean id = "helloWorld" class = "com.tutorialspoint.HelloWorld" init-method = "init" destroy-method = "destroy"> <property name = "message" value = "Hello World!"/> </bean> </beans>
Как только вы закончили создавать файлы конфигурации исходного кода и bean-компонента, давайте запустим приложение Если с вашим приложением все в порядке, оно напечатает следующее сообщение:
Bean is going through init. Your Message : Hello World! Bean will destroy now.
Методы инициализации и уничтожения по умолчанию
Если у вас слишком много бинов, имеющих методы инициализации и / или уничтожения с одинаковыми именами, вам не нужно объявлять метод init и метод destroy для каждого отдельного компонента. Вместо этого платформа предоставляет гибкость для настройки такой ситуации с использованием атрибутов default-init-method и default-destroy-method для элемента <beans> следующим образом: