2016-04-23 4 views
3

Что может быть возможным примером использования метода destroy в приложении реального мира? Почему работающее приложение хочет уничтожить его компоненты? Если бобы создаются весенним контейнером для веб-приложения, скажем, ContextLoaderListener, то как эти бобы можно воссоздать, потому что контейнер уже запущен. Есть ли способ перезапустить весенний контейнер IoC без перезапуска сервера приложений?Метод уничтожения бобы весом

ответ

4

Одним из примеров может быть DataSource или любой ресурс, который необходимо очистить. Вы могли бы иметь что-то вроде этого:

@Bean(destroyMethod = "close") 
DataSource dataSource() { 
.... 
} 

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

Иногда случается, что это избыточно, поскольку базовый ресурс может выполнять свою собственную очистку (например, как часть события contextDestroyed в жизненном цикле сервлета), но вы всегда должны это проверять.

Эти весна docs являются полезной ссылкой. Приведенный пример здесь аналогична:

<bean id="exampleInitBean" class="examples.ExampleBean" destroy-method="cleanup"/> 

Тогда класс компонента:

public class ExampleBean { 

    public void cleanup() { 
     // do some destruction work (like releasing pooled connections) 
    } 
} 

Это можно обновить контекст. Это answer дает хорошее объяснение этому и когда вы можете это сделать.

1

ниже мои взгляды:

Что может быть возможный пример использования метода уничтожения в реальном приложении?

Для большинства приложений, может быть, мы ориентируемся на реальных предприятиях, в основном, поэтому мы не будем часто встречаться сценами, где нужно определить уничтожить метод. Но когда вы встречаете некоторые основные компоненты или промежуточное программное, вам нужно обратить внимание на управления ресурсами, такие как Database Connection, Использование памяти, Disk Usage и т.д. Вы должны знать, как освободить ненужные запасы ресурсов четко , или это вызовет серьезные проблемы.

Если бобы создаются весенним контейнером для веб-приложения, скажем, ContextLoaderListener, то как эти бобы можно воссоздать, потому что контейнер уже запущен?

Spring Контейнер не только для веб-приложения, он может служить для общего применения Java (Main Application).Spring Контейнер имеет два различных типа Bean (Singleton и Prototype), Singleton Bean только предварительно инстанцирован когда Spring Container покрытие для запуска, в то время как Прототип Bean будет экземпляр, вызывая getBean каждый раз.

Есть ли способ перезапустить весенний контейнер IoC без перезапуска сервера приложений?

Spring IoC контейнер начинает быть реализован путем вызова AbstractRefreshableApplicationContext.refresh() метод. Этот метод уничтожит весь контейнер Spring IoC Container, если вы создали экземпляр Контейнер. Таким образом, вы можете вызвать этот метод для повторного создания контейнера . Если вы хотите понять Spring IoC механизм, я предлагаю вам прочитать исходный код в Spring: пружинный сердечник, весна-бобы, весна-контекст.

Надеюсь помочь вам.

0

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

Смежные вопросы