Анализ и практическое применение принципа начальной загрузки данных после запуска Spring Boot
Анализ и практическое применение принципа начальной загрузки данных после запуска Spring Boot

Привет, друзья, сегодня я поделюсь с вами статьей о технологическом росте Amway. Я верю, что если вы прочитаете ее внимательно, вы обязательно что-то приобретете!

🔗【Ссылка на статью】:«Исследование в 2024 году»

💖 Причина рекомендации: Эту статью написал Одноклассник Сяо Ху Написанный, он рассказывает историю собственного роста, тщательно записывает этот рост, а также практикует и делится техниками.


Операция инициализации системы является очень распространенным требованием. Обычно после запуска приложению необходимо выполнить некоторые важные задачи инициализации, такие как загрузка глобальной конфигурации, инициализация таблиц базы данных, предварительный разогрев кэша, запуск фоновых задач и т. д. Как выбрать подходящее техническое решение для обеспечения эффективного выполнения задач инициализации в различных сценариях, особенно в распределенном развертывании с несколькими экземплярами, как обеспечить выполнение задач только один раз, стало ключом к нашему глубокому обдумыванию и оптимизации в реальном проекте. операции. вопрос.

В этой статье будет объединена среда Spring Boot, от базового механизма запуска, основных технических принципов до сложных сценариев в распределенной среде, чтобы привести вас к постепенному и глубокому пониманию того, как выполнять задачи инициализации после запуска различными способами. Наконец, мы будем использовать практический пример проекта, чтобы продемонстрировать, как обеспечить, чтобы задача инициализации выполнялась только один раз в распределенной среде развертывания, и решить проблему повторного выполнения задачи в нескольких экземплярах.

Основные требования к задачам инициализации

У этих задач есть одна общая черта: обычно их нужно выполнить только один раз, при запуске приложения. Поэтому крайне важно выбрать подходящий механизм для выполнения этих операций инициализации и гарантировать, что задачи не будут выполняться повторно в распределенной среде. Включая, но не ограничиваясь:

  • Загрузка глобальной конфигурации:из базы данных、Конфигурациядокументили Удаленный сервис загружает глобальные параметры приложения。
  • Инициализация таблицы базы данных:Например Проверьте и создайте недостающие таблицы базы данных、Вставить исходные данные и т.д.
  • Прогрев кэша:Сразу после запуска приложения в кэш загружаются некоторые часто используемые данные.,Уменьшите задержку при первом доступе.
  • Фоновая задача запускается:Начать какочередь сообщениймонитор、Длительно работающие фоновые службы, такие как планирование запланированных задач.
  • Проверка работоспособности системы:Обеспечение критически важных зависимых услуг(например база данных、очередь сообщений、Сторонние сервисы) существования при запуске работает нормально.

Несколько способов инициализировать загрузку после запуска

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

Аннотация PostConstruct

@PostConstruct это очень краткий и часто используемый способ отметить Spring управление Bean Метод автоматически вызывается после завершения внедрения зависимостей. Этот метод особенно подходит для одного Bean операция инициализации. Весна После завершения внедрения зависимостей автоматически вызовите с помощью @PostConstruct Аннотированные методы гарантируют, что логика инициализации находится в рабочем состоянии. Bean Выполняется после завершения инициализации.

подходит для использования в конкретном Bean Задачи, которые необходимо выполнить после завершения инициализации. Например, определенная Категория услугинуждатьсясуществовать Читать во время загрузки Конфигурациядокументили Выполнение определенных операций инициализации。

Язык кода:java
копировать
@Component
public class MyService {
    @PostConstruct
    public void init() {
        // Инициализируйте задачу и выполните ее только один раз
        System.out.println("Bean Выполнить после инициализации");
    }
}

преимущество:

  • Простой и интуитивно понятный:этода Java EE Часть стандарта, использовать очень просто. Просто нужно один существующий метод добавить @PostConstruct Аннотации,Весна будет внутри Bean После инициализации Автоматический вызов Долженметод。
  • Автоматический вызов:может гарантироватьсуществовать Spring Контейнер завершен Bean После внедрения зависимостей Автоматическое выполнения операции инициализации, явный вызов не требуется.

недостаток:

  • Может обрабатывать только задачи инициализации одного компонента.@PostConstruct Метод аннотации может действовать только на конкретный Bean,существоватьэтот Bean Выполняется после завершения инициализации. Если есть несколько Bean нуждатьсяинициализация Задача,@PostConstruct Не могу пересечь Bean Логика выполнения управления.

CommandLineRunner / ApplicationRunner

CommandLineRunner и ApplicationRunner — это интерфейсы Spring Boot, используемые для выполнения задач инициализации после запуска приложения. Разница между ними заключается в форме передаваемых параметров. CommandLineRunner предоставляет исходные параметры String[], а ApplicationRunner инкапсулирует контекстную информацию параметров запуска.

CommandLineRunner:этот Предоставляемый интерфейсиздаоригинальный String[] Параметры запуска. Эти параметры обычно передаются при запуске приложения. Java Аргументы командной строки программы. Если вас интересуют параметры командной строки только при запуске приложения и вам необходимо напрямую манипулировать ими, вы можете использовать CommandLineRunner

ApplicationRunner:этот Интерфейс инкапсулирует запускчасизпараметр,проходить ApplicationArguments Класс обеспечивает доступ более высокого уровня к параметрам командной строки. Если вам нужна дополнительная функциональность (например, получение аргументов командной строки в нестандартных форматах, обработка аргументов с флагами и т. д.), вы можете использовать ApplicationRunner

преимущество

  • Применяется к глобальным задачам:несмотря ни на чтода CommandLineRunner все еще ApplicationRunner,Все могутсуществоватьвсе Bean Выполняется после завершения инициализации, чтобы гарантировать, что логика запуска приложения является глобальной.
  • Автоматическое исполнение:один развыполнитьэти интерфейсыиз Класс зарегистрирован как Spring Bean,Spring встреча Автоматический вызвать их run() метод,Выполнение задачиавтоматическое,Не обязательно звонить напрямую.

недостаток

  • Последовательное управление несколькими классами реализации:Если в проекте несколько CommandLineRunner или ApplicationRunner выбирать классы, по умолчанию порядок их выполнения не определен. Чтобы обеспечить порядок выполнения, вы можете использовать @Order Аннотации явно указывают приоритет выполнения.
  • Может быть выполнен только один раз:Этот типметодсуществовать Spring Boot Выполняется при запуске приложения,И по умолчанию он выполняется только один раз. Если вам нужно, чтобы определенные задачи выполнялись несколько раз в течение жизненного цикла приложения.,Этот подход не работает.

использовать CommandLineRunner

Язык кода:javascript
копировать
@Component
public class MyStartupRunner implements CommandLineRunner {
    @Override
    public void run(String... args) {
        // Задачи, которые необходимо выполнить после запуска этого приложения
        System.out.println("Выполнять задачи инициализации после запуска приложения");
    }
}

использовать ApplicationRunner

Язык кода:javascript
копировать
@Component
public class MyAppStartupRunner implements ApplicationRunner {
    @Override
    public void run(ApplicationArguments args) throws Exception {
        // Получить параметры командной строки
        System.out.println("Выполнить задачи инициализации после запуска приложения и получить параметры запуска:" + args.getOptionNames());
    }
}

После запуска мы найдем,@Component Порядок выполнения действительно раньше, чем ApplicationRunner и CommandLineRunner

Почему этот заказ

@Component с аннотацией Bean:Все, что отмечено как @Компонент (или @Service、@Repository、@Controller и т. д.) занятия будут проходить в Spring Boot Он автоматически сканируется и создается при запуске приложения. Эти Bean будет внутри Spring Контейнер создается и инициализируется на ранних этапах запуска, а загружается и выполняется самое раннее в процессе запуска приложения.

ApplicationRunner и CommandLineRunner: Классы реализации этих двух интерфейсов: Spring Boot Уникальные хуки запуска, они присутствуют во всех @Component Bean создается и выполняется после инициализации, но существует Spring Boot Полный запуск приложения(То есть контекст приложения готов)После выполнения。ApplicationRunner буду сравнивать CommandLineRunner выполняется раньше, поскольку он инкапсулирует больше информации о контексте параметра запуска, поэтому их run() методбудет внутри Spring Boot Полное обновление контекста Bean Выполняется после инициализации.

Контроль последовательности выполнения

Если в вашем проекте есть несколько классов отбора,И все они должны выполняться при запуске приложения,использовать @Order Аннотации могут явно контролировать порядок выполнения. Например:

Язык кода:javascript
копировать
@Component
@Order(1)  // Установите приоритет. Чем меньше число, тем выше приоритет.
public class FirstStartupTask implements CommandLineRunner {
    @Override
    public void run(String... args) {
        System.out.println("Первая задача запуска");
    }
}

@Component
@Order(2)
public class SecondStartupTask implements CommandLineRunner {
    @Override
    public void run(String... args) {
        System.out.println("Вторая задача запуска");
    }
}

Таким образом, FirstStartupTask будет внутри SecondStartupTask выполнен раньше.

События жизненного цикла Spring Boot

Spring Boot Модель программирования, управляемая событиями, может помочь разработчикам существовать в выполнении конкретных задач на разных этапах жизненного цикла приложения. Автор: Слушайте события жизненного цикла С помощью Spring разработчики могут выполнять задачи инициализации в точное время. Этот метод подходит для сценариев, где необходимо обеспечить время выполнения задач. Например, некоторые задачи не могут быть выполнены до полного запуска приложения, установления соединения с базой данных и готовности сервиса. Весна Boot В , существует множество событий жизненного цикла, таких как:

ApplicationReadyEvent:Запускается, когда приложение полностью запущено и готово обрабатывать запросы.。этотсобытиевыражать Spring Контекст приложения полностью инициализирован, и приложение готово принимать внешние запросы. Подходит для задач инициализации, выполняемых сразу после запуска приложения, таких как запуск фоновых служб, инициализация кэша и т. д.

ContextRefreshedEvent:когда Spring Запускается, когда контекст инициализируется или обновляется. Обычно это происходит, когда Spring Boot Во время запуска используется для обозначения Spring Контейнеры готовы и все Bean Инициализация завершена. - При запуске приложения удобно выполнять некоторые операции предварительного разогрева, например загрузку информации о конфигурации, инициализацию пула подключений к базе данных и т. д.

ApplicationStartedEvent:существовать Spring Boot Срабатывает при запуске приложения, происходит в Spring Может использоваться для выполнения некоторых задач ранней инициализации до загрузки контекста.

ApplicationEnvironmentPreparedEvent:существовать Spring Boot Во время запуска, когда приложение Environment Срабатывает, когда настройка завершена. Еще не инициализирован Spring Контейнеры подходят для некоторой инициализации на основе конфигурации среды.

ApplicationFailedEvent:если Spring Boot Если запуск не удался, это событие будет вызвано. Может использоваться для очистки или ведения журнала после сбоя при запуске приложения.

Слушайте события жизненного цикла Spring

Spring Boot предоставил ApplicationListener Интерфейс @EventListener аннотация приходите мониторить эти события жизненного цикла. Мы можем использовать эти два метода для выполнения задач инициализации в определенное время.

1:использовать ApplicationListener монитор ApplicationReadyEvent

путем реализации ApplicationListener Интерфейс, может быть указан как мониторсобытия, например монитор. ApplicationReadyEvent чтобы гарантировать выполнение задачи после полного запуска приложения.

Язык кода:javascript
копировать
@Component
public class ApplicationListenerExample implements ApplicationListener<ApplicationReadyEvent> {
    @Override
    public void onApplicationEvent(ApplicationReadyEvent event) {
        // Задачи, выполняемые после завершения запуска приложения
        System.out.println("Выполнять задачи после завершения запуска приложения");
    }
}
  • событиеApplicationReadyEvent да Spring Boot событие, возникающее после завершения запуска приложения.
  • Время срабатывания:существоватьвсе Bean после инициализации и Spring Когда контекст полностью загружен и готов,ApplicationReadyEvent будет срабатывать.

2:использовать @EventListener аннотациямониторсобытие

Spring 5 представил @EventListener аннотация, это более краткий способ отслеживания событий, нет необходимости явно калибровать ApplicationListener интерфейс.

Язык кода:javascript
копировать
@Component
public class EventListenerExample {
    @EventListener(ApplicationReadyEvent.class)
    public void handleApplicationReady() {
        // Задачи, выполняемые после завершения запуска приложения
        System.out.println("использовать @EventListener существуют Выполнение задач после запуска приложения");
    }
}
  • событие@EventListener(ApplicationReadyEvent.class) выражатьмонитор ApplicationReadyEvent событие。
  • Время срабатывания@EventListener аннотацияизметодбудет внутри ApplicationReadyEvent Выполнять при срабатывании, подходит для задач после полного запуска приложения.

Преимущества и недостатки событийно-ориентированного механизма

преимущество:

  1. Точно контролировать время выполнения:проходитьмониторидентификацияизжизненный циклсобытие,Разработчики могут точно контролировать время выполнения задач инициализации.,Убедитесь, что задачи выполняются только тогда, когда приложение находится в определенном состоянии. Например,ApplicationReadyEvent Событие гарантирует, что задачи будут выполняться только после полного запуска приложения.
  2. Отдельная логика приложения:использоватьсобытиемонитормеханизм,Разработчикам не нужно явно вызывать задачи инициализации непосредственно во время запуска приложения. Драйвер событий может помочь разделить логику запуска приложения и логику выполнения задач.,Сделайте код более понятным и простым в обслуживании.
  3. Обработка сложной логики инициализации:еслиинициализация Логика сложнее,У пользователя есть несколько задач, которые необходимо выполнить в определенном порядке.,событиемеханизмможет обеспечить гибкуюизконтроль。Например,ContextRefreshedEvent Может гарантировать существование некоторых задач инициализации Spring Выполняется после завершения инициализации контекста.

недостаток:

  1. Зависит от триггера события:событиемеханизмизнедостатокда Задачаизисполнение зависит отсобытиеизкурок,Это требует от разработчиков некоторого понимания механизма событий Spring. Если ожидаемое событие не происходит во время запуска приложения,Задачи инициализации могут упустить возможности выполнения.
  2. Отладка сложна:если Задачаисполнение зависит отидентификацияизсобытиекурок,возможно, потребуется особое внимание к логике монитора при отладке.,Невыполнение этого требования может привести к тому, что задача не будет выполняться должным образом.
  3. стоимость обучения:Нетиспользовать Проходить Spring событиемеханизмиз Для разработчиков,Чтобы изучить и понять принципы публикации событий, требуется некоторое время.,Особенно в дасуществовать множество сценариев событий.,Ознакомьтесь с порядком сообщения монитора событий.

использовать @Bean(initMethod) Определить собственный метод инициализации

существовать Spring середина,@Bean(initMethod) предоставил Что-то вроде Настроить Bean Способ инициализации метода. С помощью этого механизма разработчики могут предоставлять конкретные Bean Укажите метод инициализации, который будет использоваться внутри Spring Контейнер завершает Bean Внедрение зависимостей и постэкземплярное создание Автоматическое исполнение。в целом,Этот метод используется для обработки некоторых сложных операций инициализации.,Например Инициализировать соединение с базой данных、Загрузить внешнюю конфигурацию、Запуск фоновых задач и т. д.

Подходит для тех, кому требуется сложная инициализация Bean:когда Bean Инициализация требует выполнения сложных операций (например, вызова внешнего API, загрузка исполняемого файла, инициализация подключения к базе данных и т. д.), вы можете передать initMethod Укажите метод инициализации без существования Bean добрыйсерединаиспользовать @Аннотация PostConstructили CommandLineRunner и т. д.

Внешняя конфигурация управляет логикой инициализации:@Bean(initMethod = "init") разрешено Bean Метод инициализации привязан к внешней конфигурации, что позволяет разработчикам более гибко управлять Bean процесс инициализации.

Язык кода:javascript
копировать
@Configuration
public class AppConfig {
    @Bean(initMethod = "init")
    public MyService myService() {
        return new MyService();
    }
}

public class MyService {
    // Настроить логику инициализации
    public void init() {
        System.out.println("Настроитьинициализацияметод");    }
}
  1. @Bean(initMethod = "init"):здесь,@Bean Аннотировано как MyService Определяет метод инициализации иниц. когда MyService Bean После создания и завершения внедрения зависимостей init методбудет Автоматический вызов。
  2. init() метод:MyService Класс определяет класс с именем init() изметод,этотметодсуществовать Bean После завершения инициализации будет Автоматический вызов。в целом,Этот метод содержит дополнительную логику инициализации.,Например, загрузка и инициализация внешних ресурсов.

Анализ преимуществ и недостатков

преимущество:

  1. гибкость@Bean(initMethod) Позволяет разработчикам гибко указывать имя метода инициализации, подходящее для тех, кому необходимо существование. Bean Сценарии, в которых определенные задачи выполняются во время инициализации. и @PostConstruct или CommandLineRunner ждатьметодпо сравнению с,@Bean(initMethod) Больше возможностей управления, особенно в сложных приложениях.
  2. Поддержка сложной логики инициализации:когда Bean Процесс инициализации относительно сложен (например, необходимо загрузить конфигурацию, запустить поток или обработать соединение с базой данных и т. д.), вы можете использовать initMethod метод определяет конкретную логику инициализации.
  3. Отвязано от файлов конфигурации Spring.:существоватьиспользовать @Configuration Конфигурация в классе Bean час,initMethod вид, который не зависит от Bean Способ инициализации самого класса. это помогает Bean из Конфигурацияивыполнитьразделение。

недостаток:

  1. Немного менее читабельно:по сравнению с @PostConstruct или CommandLineRunner ждатьаннотацияиз Способ,@Bean(initMethod) Нужен разработчик в конфигурации явно указывается имя метода инициализатора, что может привести к коду Немного менее читабельно, тем более в дасуществовать несколько Классов При настройке нескольких методов инициализации разработчикам может потребоваться более тщательно управлять этими методами.
  2. Подходит не для всех типов инициализации.:для некоторых простыхиз Bean Задачи инициализации, такие как загрузка базовой конфигурации и предварительная обработка базовых данных, @Bean(initMethod) Может показаться слишком излишним. В это время используйте @PostConstruct или CommandLineRunner Другие методы более краткие и прямые.
  3. Инициализировать зависимости метода Spring Управление контейнерами@Bean(initMethod) Инициализация, указанная в методе, должна быть выполнена Spring контейнеруправление Бобы. существуют в некоторых случаях (например, в некоторых чистых Java Объект или создан вручную Bean), не может быть инициализирован напрямую.

Комплексная проектная практика

Описание требований

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

  1. из базы данныхили Удаленная служба загружается по всему миру Конфигурация。
  2. Инициализируйте некоторые таблицы базы данных (если существующие не существуют).
  3. Теплый кэш.
  4. Запуск фоновых задач (например, запланированных задач).
  5. существовать в многоэкземплярной распределенной среде,обеспечить определенныеинициализация Задача Выполнять только один раз(нравитьсяинициализациянекоторые основные данные、нагрузка Конфигурацияждать)。

Схема проектирования

мы будемиспользовать Spring Boot Различные методы инициализации в сочетании с Распределенной блокировка, гарантирующая, что задача будет выполнена только один раз. В частности, используйте следующие технологии:

  1. @PostConstruct:для простогозадачи инициализации。
  2. CommandLineRunner:для глобальных задач,существование выполняется после запуска приложения.
  3. Spring событиемеханизм:используется для精确контроль Задачаизосуществлятьчасмашина。
  4. Распределенная блокировка(на основе Redis): Убедитесь, что в существующей среде с несколькими экземплярами задача выполняется только один раз.
  5. Настроить @Bean(initMethod):длянуждатьсяособенныйинициализациялогикаиз Bean Указывает метод инициализации.

1. Структура проекта

Язык кода:java
копировать
src
└── main
    ├── java
    │   └── com
    │       └── example
    │           ├── Application.java
    │           ├── config
    │           │   └── AppConfig.java
    │           ├── initializer
    │           │   ├── AppStartupRunner.java
    │           │   ├── CacheInitializer.java
    │           │   └── DistributedLockInitializer.java
    │           └── service
    │               └── MyService.java
    └── resources
        └── application.properties

2. application.properties

Язык кода:properties
копировать
# Redis Конфигурация
spring.redis.host=localhost
spring.redis.port=6379

# Конфигурация базы данных (если используется MySQL)
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=root

3. Класс входа основного приложения Application.java

Язык кода:java
копировать
package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

4. Класс конфигурации AppConfig.java

Язык кода:java
копировать
package com.example.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.example.service.MyService;

@Configuration
public class AppConfig {

    @Bean(initMethod = "init")
    public MyService myService() {
        return new MyService();
    }
}

5. Категория услуги MyService.java

Язык кода:java
копировать
package com.example.service;

public class MyService {

    public void init() {
        // Здесь можно выполнять сложные операции инициализации, такие как вызовы внешних API и т. д.
        System.out.println("Выполнить MyService из Настроитьинициализацияметод");    }
}

6. Запустить класс задачи инициализации AppStartupRunner.java

Язык кода:java
копировать
package com.example.initializer;

import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

@Component
public class AppStartupRunner implements CommandLineRunner {
    @Override
    public void run(String... args) throws Exception {
        // Выполнить задачу после запуска приложения инициализации
        System.out.println("Выполнить Запуск приложениячасизобщая ситуацияинициализация Задача");
    }
}

7. Класс инициализации кэша CacheInitializer.java

Язык кода:java
копировать
package com.example.initializer;

import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

@Component
public class CacheInitializer {

    @PostConstruct
    public void init() {
        // Предварительный разогрев логики кэша, например загрузка часто используемых данных в кэш.
        System.out.println("Выполнить Прогрев кэшазадач");
    }
}

8. Класс инициализации распределенной блокировки DistributedLockInitializer.java

Язык кода:java
копировать
package com.example.initializer;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;

@Component
public class DistributedLockInitializer implements ApplicationListener<ApplicationReadyEvent> {

    @Autowired
    private StringRedisTemplate redisTemplate;

    @Override
    public void onApplicationEvent(ApplicationReadyEvent event) {
        // получать Распределенная блокировка, убедитесь, что задача инициализации выполняется только один раз
        Boolean success = redisTemplate.opsForValue().setIfAbsent("init_lock", "locked");
        if (Boolean.TRUE.equals(success)) {
            // 模拟осуществлятьинициализация Задача(нравитьсяинициализациятехническая спецификация、нагрузка Конфигурацияждать)
            System.out.println("Выполнитьинициализация Задача:инициализациябаза данныхилинагрузка Основные данные");
            // Здесь вы можете выполнять такие задачи, как инициализация таблиц базы данных и загрузка данных по умолчанию.
        } else {
            System.out.println("Задача выполнялась в других экземплярах, текущий экземпляр пропустил задачу");
        }
    }
}

9. Ключевые технологии и дизайн

  1. @PostConstruct:используется для Прогрев кэшазадачи,существовать Bean Выполняется сразу после завершения инициализации.
  2. CommandLineRunner:общая ситуация Задачаизосуществлять Способ,Убедитесь, что некоторые операции инициализации выполняются после запуска приложения.
  3. Механизм eventDrive (ApplicationReadyEvent):精确контроль Задачаосуществлятьизчасмашина,Убедитесь, что приложение существования задачи полностью запущено и готово к выполнению.
  4. Распределенная блокировка(на основе Redis):убеждатьсяинициализация Задачасуществовать Развертывание нескольких экземпляровизсредасередина Выполнять только один раз。проходить StringRedisTemplate выполнить Redis из Распределенная блокировка, предотвращающая повторное выполнение одной и той же задачи в нескольких экземплярах существования.
  5. @Bean(initMethod):дляидентификацияиз Bean Укажите метод Настроить для инициализации, который подходит для сценариев, требующих сложной инициализации.

10. Эффект операции

  • При запуске приложения CommandLineRunner выполнит глобальные задачи инициализации, чтобы гарантировать выполнение задач после запуска приложения.
  • CacheInitializer будет внутри Bean После завершения инициализации выполните Прогрев. кэша。
  • DistributedLockInitializer пройдет Redis Распределенная блокировкаубеждатьсяинициализация Задача выполняется только один раз.нравиться Задачаужесуществовать Другие случаисерединаосуществлять,Текущий экземпляр пропускает эту задачу.

Ключевые выводы

  • существуют в автономной среде @PostConstruct и CommandLineRunner и т. д. достаточны для удовлетворения большинства потребностей в инициализации.
  • существовать в распределенной среде,Необходимо гарантировать, что задача инициализации выполняется только один раз.,рекомендоватьиспользоватьна основе Redis из Распределенная блокировка, чтобы избежать повторного выполнения.
  • Spring Предусмотрен механизм события и @Bean(initMethod) Позвольте разработчикам гибко контролировать сроки выполнения и логику задач для удовлетворения потребностей сложных бизнес-сценариев.

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

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