Поиграйте с жизненным циклом Spring Lifecycle и SmartLifecycle
Поиграйте с жизненным циклом Spring Lifecycle и SmartLifecycle

🍕 1. Введение

чтениеKafkaисходный код,читатьKafkaMessageListenerContainerдобрый,в методе входа doStart() середина,Первая логическая область основана наisRunning()Возвращаемое значение метода используется для определения того, продолжает ли метод работать.:

KafkaMessageListenerContainer#doStart:

Язык кода:Java
копировать
protected void doStart() {
 if (isRunning()) {
  return;
 }
 if (this.clientIdSuffix == null) { // stand-alone container
  checkTopics();
 }
 ContainerProperties containerProperties = getContainerProperties();
 checkAckMode(containerProperties);
 ......
}

ЧтоisRunning()Каков метод?,Прослеживая резервную копию, мы обнаруживаем, что этоSmartLifecycleинтерфейссерединаопределенныйметод,такKafkaMessageListenerContainerдобрыйвыполнитьполучил имя по имениSmartLifecycleинтерфейс。Если вы видели исходный код большинства фреймворков,ты найдешьSmartLifecycleинтерфейс Частота возникновения очень высока,что это такое,Какая польза? Давайте узнаем об этом больше вместе!

🍔два、Жизненный цикл

ОбъяснениеSmartLifecycleинтерфейсчас,Сначала объясниSmartLifecycleинтерфейсотецинтерфейсLifecycle,Не волнуйся,Их функция одна и та же,ноSmartLifecycleв детстведобрый Функция будет более мощной,ноLifecycleинтерфейсэто еще надо понять。

🍟 2.1 Роль жизненного цикла

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

  1. Вот что выполняется после создания всех bean-компонентов,Не похоже на то, что мы часто используем@PostConstructи@PreDestroyдве ноты,Они выполняют некоторые операции при инициализации или уничтожении компонента.,Эти операции относятся кBeanжизненный уровень цикла;
  2. Lifecycleинтерфейс Это решает другие сценарии,Например, мы хотим добавить жизненный в сам контейнер Поработайте над такими событиями, как запуск и остановка контейнера.

🌭 2.2 Определение жизненного цикла

Давайте сначала посмотрим на его определение:

Язык кода:Java
копировать
public interface Lifecycle {
    void start();

    void stop();

    boolean isRunning();
}

Lifecycleинтерфейсопределенныйтрииндивидуальныйметод:

имя метода

автор

start()

Вызывается после запуска контейнера

stop()

Вызывается, когда контейнер остановлен

isRunning()

Проверьте, запущен ли этот компонент

когдаApplicationContextполученныйstartstopиrestartВ ожидании сигнала,Он будет вызван и реализованLifecycleинтерфейсизBeanсоответствующий метод。путем реализацииLifecycleинтерфейс,Мы можем получить обратный вызов контейнера жизненный цикл,Это дает возможность расширения бизнеса.

🍿 2.3 Использование жизненного цикла

Давайте сделаем этоLifecycleинтерфейс,Давайте посмотрим на его конкретные практические эффекты:

Язык кода:java
копировать
@Component
public class MyLifecycle implements Lifecycle {

    /**
     * Текущий статус
     */
    private volatile boolean running = false;

    /**
     * Вызывается после запуска контейнера
     */
    @Override
    public void start() {
        System.out.println("После получения сигнала на запуск контейнера выполните операцию запуска MyLifecycle...");
        running = true;
    }

    /**
     * Вызывается, когда контейнер остановлен
     */
    @Override
    public void stop() {
        System.out.println("После получения сигнала о закрытии контейнера выполните операцию остановки MyLifecycle...");
        running = false;
    }

    /**
     * Проверьте, запущен ли этот компонент。
     * 1. Только когда этот метод возвращает false, метод start() будет выполнен после запуска контейнера.
     * 2. Только когда этот метод возвращает true, метод остановка() будет выполняться только тогда, когда контейнер остановлен.
     */
    @Override
    public boolean isRunning() {
        System.out.println("Проверьте Текущий компонент MyLifecycle статус:" + running);
        return running;
    }
}

Затем запустите проект SpringBoot, и вы обнаружите, что во время запуска соответствующие журналы не распечатываются, только когда приложение закрыто:

После получения сигнала о закрытии контейнера выполните операцию остановки MyLifecycle...

🥓 2.4 Проблема жизненного цикла

почему?существоватьSpringBootилиSpringприложениесередина,Если вы просто реализуете интерфейс жизненного цикла без явного вызова метода start() класса AbstractApplicationContext,Тогда метод start() и метод isRunning() в интерфейсе жизненного цикла не будут выполнены.Однако,при выходе из приложения,ВыполнюisRunning()метод определенияLifecycleОно началось?,если возвращает истину,будет вызванstop()способы остановить。

Эта реализация требует от пользователя явного вызова контейнера.start()иstop()метод может быть запущенLifecycleинтерфейсизметодосуществлять,В общих проектах,Мы редко называем это явно так. Чтобы решить эту проблему,SpringпредоставилSmartLifecycleинтерфейс,Давайте начнем объяснять это ниже.

🍳 три、SmartLifecycle

🥙 3.1 Роль SmartLifecycle

SmartLifecycleунаследованныйLifecycleинтерфейс,И предоставляет более умные функции:

  1. выполнитьSmartLifecycleинтерфейсиз组件可以自动启动иостанавливаться;
  2. Порядок выполнения нескольких компонентов можно контролировать.

при запуске приложения,будет вызван автоматическивыполнить ПонятноSmartLifecycleинтерфейсиз组件изstart()метод,без явного вызова контейнераstart()метод。поэтому,Если вы хотите, чтобы жизненный циклический метод компонента выполнялся автоматически без явного вызова метода контейнера,Можно считатьвыполнитьSmartLifecycleинтерфейса не простовыполнитьLifecycleинтерфейс。

🍖 3.2 Определение SmartLifecycle

Давайте сначала взглянем на исходный код интерфейса SmartLifecycle:

Язык кода:java
копировать
public interface SmartLifecycle extends Lifecycle, Phased {

	int DEFAULT_PHASE = Integer.MAX_VALUE;

	default boolean isAutoStartup() {
		return true;
	}

	default void stop(Runnable callback) {
		stop();
		callback.run();
	}

	@Override
	default int getPhase() {
		return DEFAULT_PHASE;
	}

}

Это можно увидеть,SmartLifecycleинтерфейс除Понятно继承Lifecycleинтерфейсснаружи,также по наследствуPhasedинтерфейс来获得控制осуществлять顺序из能力。Чтосередина,getPhase()методотPhasedинтерфейс,Определяется путем возврата значения этапаSmartLifecycleПорядок выполнения компонентов。поэтому,путем реализацииSmartLifecycleиPhasedинтерфейс,Гибкое управление компонентамижизненный циклы Порядок выполнения.

🍚 3.3 Использование SmartLifecycle

Давайте сделаем этоSmartLifecycleинтерфейс,Давайте посмотрим на его конкретные практические эффекты:

Язык кода:java
копировать
@Component
public class MySmartLifecycle implements SmartLifecycle {

    private volatile boolean running = false;

    /**
     * Если контекст, в котором находится класс Lifecycle, хочет иметь возможность автоматически выполнять обратные вызовы при вызове, верните true.
     * Значение false указывает, что компонент предназначен для запуска с помощью явного вызова start(), аналогично обычной реализации жизненного цикла.
     */
    @Override
    public boolean isAutoStartup() {
        return true;
    }

    /**
     * Этот метод доступен только в подклассах SmartLifecycle. Этот метод будет вызываться только тогда, когда метод isRunning возвращает true.
     */
    @Override
    public void stop(Runnable callback) {
        System.out.println("Контейнер MySmartLifecycle остановлен остановить (Runnable) метод Есть функция обратного звонка...");
      
        // Вызов метода остановки без функции обратного вызова
        stop();
      
        // Если вы позволите isRunning вернуть true и выполнить метод остановки, не забудьте вызвать callback.run().
        // В противном случае при выходе из программы Spring DefaultLifecycleProcessor посчитает, что MySmartLifecycle не был завершен с остановкой, и программа зависнет и не сможет быть завершена. Она автоматически завершится после ожидания в течение определенного периода времени (время ожидания по умолчанию равно 30). секунды).
        callback.run();
    }

    /**
     * 1. В основном в этом методе начать некоторые задачи или Запустите некоторые другие асинхронные службы, например включив MQ для получения сообщений.
     * 2. Этот метод будет вызываться при обновлении контекста (после создания и инициализации всех объектов).
     * по умолчаниюжизненный Процессор циклов проверит логическое значение, возвращаемое методом isAutoStartup() каждого объекта SmartLifecycle.
     * Если «true», этот метод будет вызываться вместо ожидания явного вызова собственного метода start().
     */
    @Override
    public void start() {
        System.out.println("Запуск контейнера MySmartLifecycle завершен метод start()...");
        running = true;
    }

    /**
     * Метод подкласса интерфейса Lifecycle. Этот метод будут выполнять только подклассы, не относящиеся к SmartLifecycle.
     * 1. Этот метод работает только для классов, которые непосредственно реализуют интерфейс Lifecycle, и недействителен для классов, реализующих интерфейс SmartLifecycle.
     * 2. Метод stop() и метод stop(Runnable обратный вызов) заключается в том, что последний является эксклюзивным для подкласса SmartLifecycle.
     */
    @Override
    public void stop() {
        System.out.println("Контейнер MySmartLifecycle остановлен метод остановки() Нет функции обратного звонка...");
        running = false;
    }

    /**
     * 1. Метод start будет выполнен только в том случае, если этот метод вернет false.
     * 2. Только когда этот метод вернет true, остановите (Runnable обратный вызов) метод будет выполнен.
     */
    @Override
    public boolean isRunning() {
        System.out.println("MySmartLifecycle проверяет статус работы метод isRunning()...");
        return running;
    }

    /**
     * Если существует несколько классов, реализующих интерфейс SmartLifecycle,
     * Тогда порядок выполнения методов start() этих классов основывается на возвращаемом значении метода getPhase() от малого к большому, например: сначала выполняются от 1 до 2, первым выполняются от -1 до 0.
     * И такие методы Порядок выполнения остановки() — от большего к меньшему, в зависимости от возвращаемого значения метода getPhase(). Например: 2 выполняется первым, 1 выполняется позже, а 0 выполняется последним.
     */
    @Override
    public int getPhase() {
        return 0;
    }
}

Что касается функции каждого метода, комментарии были четко объяснены. Давайте запустим проект SpringBoot и распечатаем журнал следующим образом:

MySmartLifecycle проверяет статус работы методом isRunning()... Контейнер MySmartLifecycle запускается методом start()...

Закройте проект SpringBoot и распечатайте журнал следующим образом:

MySmartLifecycle проверяет статус работы методом isRunning()... Контейнер MySmartLifecycle останавливает метод stop(Runnable) с функцией обратного вызова... Контейнер MySmartLifecycle останавливает метод stop() без функции обратного вызова...

🍬 3.4 Краткое описание SmartLifecycle

Основываясь на приведенных выше примерах, его можно резюмировать следующим образом:

  1. еслиBeanвыполнить ПонятноSmartLifecycleинтерфейс,когдаSpring容器启动час会自动осуществлять它из启动метод。существоватьосуществлять启动метод До,пройдетisRunning()метод检查组件из Текущий статус,Если возвращаемое значениеfalseУказывает, что операция запуска еще не выполнена.,В это время он будет называтьсяstart()методначинать。
  2. когдаSpringкогда контейнер закрыт,Компоненты проверю Текущий статус,И при необходимости выполните операции выключения. Если компонент запущен,Будет вызван соответствующий метод остановки. в то же время,Могут быть обработаны соответствующие функции обратного вызова.
  3. SmartLifecycleинтерфейссерединаизgetPhase()метод返回из值越小,Чем выше приоритет,Указывает, что он будет выполняться первым во время процессов запуска и остановки.

🍺 4. Резюме

В этой статье мы впервые разберемся что такоеLifecycle и Lifecycleроль,По своим недостаткам,引出比它更强из子добрыйSmartLifecycle。наспутем реализацииSmartLifecycleинтерфейс,Может более гибко контролировать запуск и остановку компонентов.,и определить порядок их выполнения。SmartLifecycleСуществует большое количество практических случаев его использования.,Таким образом, независимо от фактического боя или чтения исходного кода,Лучше знатьSmartLifecycleСвязанныйинтерфейс。

Если у вас есть какие-либо вопросы или вам нужна помощь по этой статье, оставьте сообщение в области комментариев, и я постараюсь ответить на него. Если эта статья была для вас полезна, пожалуйста, поставьте лайк в знак вашей поддержки, большое спасибо! 💗

Я участвую в специальном тренировочном лагере Tencent Technology Creation 2024 Пятый выпуск Объявлен конкурс сочинений, разделите приз со мной!

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose