Изучение процесса запуска приложения SpringBoot

задняя часть Spring контейнер
Изучение процесса запуска приложения SpringBoot

В этой статье всего 946 слов, и ее чтение занимает около 3 минут!


Обзор

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

SpringBoot 的两个关键元素

По сравнению с типичным кодом выше, эти два элемента:

  • @SpringBootApplication
  • SpringApplicationа такжеrun()метод

о@SpringBootApplicationАнатомия аннотаций уже выше:«Изучение структуры из трех тел, стоящей за аннотацией @SpringBootApplication в SpringBoot»На самом деле за этим стоит трехкорпусная структура, но SpringBoot просто придал ей пакет. Итак, в этой статье мы рассмотрим этоSpringApplicationа такжеrun()Что же это за метод, и какие тайны за ним скрываются?

Примечание:Эта статья была впервые опубликована вMy Personal Blog,Добро пожаловатьмаленькая станция

Содержание этой статьи следующее:

本文内容脑图


SpringПриложение с первого взгляда

Класс SpringApplication следует рассматривать как "инновационный" продукт среды SpringBoot. В оригинальном Spring такого класса нет. SpringApplication инкапсулирует набор процессов запуска приложения Spring. Однако это полностью прозрачно для пользователя, поэтому, когда мы начать работу с SpringBoot, мы чувствуем себя просто и удобно.

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

Давайте возьмем каштан и разберем и напишем стартовый класс приложения SpringBoot, с которым мы знакомы каждый день:

@SpringBootApplication
public class CodeSheepApplication {
	public static void main( String[] args ) {
		// SpringApplication.run( CodeSheepApplication.class args ); // 这是传统SpringBoot应用的启动,一行代码搞定,内部默认做了很多事
		SpringApplication app = new SpringApplication( CodeSheepApplication.class );
		app.setXXX( ... ); // 用户自定的扩展在此 !!!
		app.run( args );
	}
}

После такой разборки мы обнаружили, что нам также нужно сначала сконструировать объект класса SpringApplication, а затем вызвать объектrun()метод. Тогда давайте поговорим о процессе создания SpringApplication и егоrun()Процесс метода, разберись с этим, потом разберись, как работает приложение SpringBoot!


Инициализация экземпляра SpringApplication

Давайте посмотрим на код:

SpringApplication 实例的初始化代码

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

  • Сделайте вывод о типе приложения: создайте один из трех типов: REACTIVE application, SERVLET application и NONE.

推断应用的类型

  • использоватьSpringFactoriesLoaderНайдите и загрузите путь к классамMETA-INF/spring.factoriesВсе что есть в файлеApplicationContextInitializer

ApplicationContextInitializer 加载

  • использоватьSpringFactoriesLoaderНайдите и загрузите путь к классамMETA-INF/spring.factoriesВсе что есть в файлеApplicationListener

ApplicationListener 加载

  • Выведите и установите определяющий класс основного метода

推断并设置main方法的定义类



Изучение метода run() SpringApplication

Давайте посмотрим, как выглядит код:

SpringApplication 的run()方法背后的奥秘

Я отметил основные шаги на картинке выше. Кроме того, я также нарисовал блок-схему в соответствии с моим собственным пониманием, как показано ниже. Вы можете сверить ее с цифрами:

SpringBoot 应用启动流程图

Резюмируем каждый шаг следующим образом:

  1. пройти черезSpringFactoriesLoaderнагрузкаMETA-INF/spring.factoriesфайл, получить и создатьSpringApplicationRunListenerобъект

  2. затем поSpringApplicationRunListenerотправить стартовое сообщение

  3. Создайте параметры и настройте среду, которую будет использовать текущее приложение SpringBoot.

  4. После завершения ещеSpringApplicationRunListenerдля отправки сообщения environmentPrepared

  5. СоздайтеApplicationContext

  6. инициализацияApplicationContextи установите среду, загрузите конфигурацию и т. д.

  7. Зависит отSpringApplicationRunListenerвыдаватьcontextPreparedсообщение, которое сообщает приложению SpringBoot использоватьApplicationContextготов ОК

  8. Загрузите различные бобы вApplicationContext, продолжить поSpringApplicationRunListenerвыдать сообщение contextLoaded, чтобы сообщить приложению SpringBoot оApplicationContextЗаполнено ОК

  9. обновить ApplicationContext, последний шаг, когда контейнер IoC доступен

  10. Зависит отSpringApplicationRunListenerвыдать запущенное сообщение

  11. Завершите окончательный запуск программы

  12. Зависит отSpringApplicationRunListenerдля выдачи рабочего сообщения, чтобы сообщить, что программа работает

На этом весь процесс закончен!



постскриптум

Из-за ограниченных возможностей, если есть ошибки или неуместность, пожалуйста, критикуйте и исправьте их, учитесь и обменивайтесь мнениями вместе!



МожетНажмитеилисканированиеследующеебудь остороженподписаться на официальный аккаунт автораCodeSheep, получить большеПрагматичный, понятный, воспроизводимыйИсходный текст ↓↓↓

CodeSheep · 程序羊