есть ли что-то вроде @predestroy весной, как в замке Виндзор - PullRequest
3 голосов
/ 07 мая 2011

Что-нибудь вроде @PreDestroy в каркасе пружины?

Ответы [ 4 ]

15 голосов
/ 09 мая 2011

Если вы определите бин, реализующий интерфейс DisposableBean, Spring вызовет метод

void destroy() throws Exception;

, прежде чем уничтожить бин.

Это один из способов, а другой - когда ваш бин не работает.не нужно реализовывать данный интерфейс.В одном из ваших классов ConfigurationSupport ваш компонент должен быть определен как метод pulic с аннотацией @Bean.

   @Bean (destroyMethod="yourDestroyMethod")
   public YourBean yourBean() {
      YourBean yourBean = new YourBean();

      return yourBean;
   }

Метод yourDestroyMethod должен быть определен в YourBean.class, а затем Spring будет вызывать егоперед уничтожением компонента.

Для получения дополнительной информации см. документацию Spring: Обратные вызовы уничтожения

ОБНОВЛЕНИЕ

Третий способ... Я бы даже сказал, что лучший способ - указать "init-method" и "destroy-method" вашего компонента ... вот так: mkyong.com / spring / spring-init-method-and-destroy-method-example

Это решает проблему сторонних bean-компонентов зависимостей и освобождает код от ненужных интерфейсов Spring.

6 голосов
/ 06 июня 2011

Есть 3 способа сделать это.

@ тег PreDestroy

метод уничтожения в XML

интерфейс DisposableBean, как указано выше

Мой любимец - это метод @PreDestroy.

Для этого вам нужно:

В application-context.xml добавить следующую схему:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                            http://www.springframework.org/schema/context
                            http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <bean id="shutDownBean" class="spring.ShutDownBean" />
    <context:annotation-config/>
</beans>

Доступны теги @ PreDestroy и @ PostDestroy . Теперь предположим, что у вас есть ShutDownBean, который вы хотите запустить некоторый код при вызове обратного вызова выключения. регистрирует бин.

import javax.annotation.PreDestroy;

public final  class ShutDownBean {

    @PreDestroy
    public static void shutDownMethod() {
        System.out.println("Shutting down!");
    }

}

Теперь все готово.

Если у вас есть настольное приложение , чтобы использовать аннотацию @PreDestroy, вам необходимо закрыть ее следующим образом:

AbstractApplicationContext applicationContext =
                new ClassPathXmlApplicationContext("application-context.xml");
applicationContext.registerShutdownHook();

примечание: AbstractApplicationContext имеет реализацию registerShutdownHook () , так что это минимальный класс, который вы можете использовать.

Также, если вы можете использовать тег destroy-method для классов, вы не контролируете их реализацию. например, вы можете добавить это в ваш applcation-context.xml:

<bean id = "dataSource" 
      class = "org.apache.commons.dbcp.BasicDataSrouce"
      destroy-method = "close">

Значение метода destroy может иметь любую видимость, но не должно иметь аргументов.

Надеюсь, это поможет!

3 голосов
/ 07 мая 2011

Вы имеете в виду, как аннотирование метода стандартным JDK @PreDestroy? Это достаточно распространено в Spring и обычно лучше, чем использование атрибута destroy-method в объявлении компонента в XML. Все, что вам нужно сделать, это включить

<context:annotation-config/> 

В вашем конфигурационном файле и Spring обрабатывает все остальное.

0 голосов
/ 07 мая 2011

есть стандартный метод .NET IDisposable.Dispose().Я не знаю Spring, но из-за быстрого поиска в Google кажется, что @predestroy - это почти та же концепция.

...