Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Spring: Spring, Bean lifecycle, Destroy, DisposableBean, @PreDestroy

Как выполнить код при уничтожении бина?

Этот вопрос проверяет понимание жизненного цикла бинов в Spring и умение выполнять действия при их уничтожении, что важно для корректного освобождения ресурсов.

Короткий ответ

В Spring Framework код при уничтожении бина можно выполнить несколькими способами. Самый простой — реализовать интерфейс `DisposableBean` и переопределить метод `destroy()`. Более современный и рекомендуемый подход — использовать аннотацию `@PreDestroy` над методом в классе бина. Также можно указать метод уничтожения в конфигурации XML или Java Config. Spring вызовет этот метод перед тем, как бин будет удалён из контекста приложения, например, при закрытии контекста.

Длинный ответ

В Spring Framework управление жизненным циклом бинов — ключевая особенность IoC-контейнера. Выполнение кода при уничтожении бина необходимо для корректного завершения работы: закрытия соединений с базой данных, освобождения сетевых сокетов, остановки фоновых потоков или сохранения состояния. Spring предоставляет несколько стандартных механизмов для этого.

Основные способы

  • Реализация интерфейса DisposableBean: Этот интерфейс объявляет единственный метод destroy(). Spring автоматически вызовет его при уничтожении бина. Однако этот подход связывает ваш класс напрямую с Spring API, что считается менее гибким.
  • Использование аннотации @PreDestroy: Это часть спецификации JSR-250 (Java Annotations). Метод, помеченный этой аннотацией, будет вызван контейнером. Это предпочтительный способ, так как он не привязывает код к Spring и является декларативным.
  • Объявление метода уничтожения в конфигурации: В XML-конфигурации можно использовать атрибут destroy-method у элемента <bean>. В Java Config (аннотация @Bean) можно указать свойство destroyMethod.

Практические примеры

Пример с аннотацией @PreDestroy:

import javax.annotation.PreDestroy;

@Component
public class DatabaseConnectionPool {
    
    public void connect() {
        // Инициализация пула соединений
    }
    
    @PreDestroy
    public void cleanup() {
        // Закрытие всех соединений, освобождение ресурсов
        System.out.println("Closing all database connections...");
    }
}

Пример с интерфейсом DisposableBean:

import org.springframework.beans.factory.DisposableBean;

@Component
public class NetworkService implements DisposableBean {
    
    @Override
    public void destroy() throws Exception {
        // Остановка сетевого сервиса
        System.out.println("Network service is shutting down...");
    }
}

Пример конфигурации с @Bean и указанием метода:

@Configuration
public class AppConfig {
    
    @Bean(destroyMethod = "close")
    public SomeResource someResource() {
        return new SomeResource();
    }
}

// Класс SomeResource имеет метод close()
class SomeResource {
    public void close() {
        // Логика очистки
    }
}

Вывод: Используйте аннотацию @PreDestroy для стандартного и чистого подхода в большинстве случаев. Интерфейс DisposableBean или явное указание метода в конфигурации полезны, когда вы не можете модифицировать исходный класс или нуждаетесь в более тонком контроле из конфигурации. Это гарантирует, что ваше приложение корректно освобождает ресурсы при завершении работы.

Уровень

  • Рейтинг:

    3

  • Сложность:

    4

Навыки

  • Spring

    Spring

Ключевые слова

#Spring

#Bean lifecycle

#Destroy

#DisposableBean

#@PreDestroy

Подпишись на Java Developer в телеграм