В этой статье всего 946 слов, и ее чтение занимает около 3 минут!
Обзор
Когда дело доходит до начала работы со 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
Давайте посмотрим на код:
На рисунке отмечены четыре ключевых шага, которые поясняются следующим образом:
- ①Сделайте вывод о типе приложения: создайте один из трех типов: REACTIVE application, SERVLET application и NONE.
-
②использовать
SpringFactoriesLoader
Найдите и загрузите путь к классамMETA-INF/spring.factories
Все что есть в файлеApplicationContextInitializer
-
③использовать
SpringFactoriesLoader
Найдите и загрузите путь к классамMETA-INF/spring.factories
Все что есть в файлеApplicationListener
- ④Выведите и установите определяющий класс основного метода
Изучение метода run() SpringApplication
Давайте посмотрим, как выглядит код:
Я отметил основные шаги на картинке выше. Кроме того, я также нарисовал блок-схему в соответствии с моим собственным пониманием, как показано ниже. Вы можете сверить ее с цифрами:
Резюмируем каждый шаг следующим образом:
-
пройти через
SpringFactoriesLoader
нагрузкаMETA-INF/spring.factories
файл, получить и создатьSpringApplicationRunListener
объект -
затем по
SpringApplicationRunListener
отправить стартовое сообщение -
Создайте параметры и настройте среду, которую будет использовать текущее приложение SpringBoot.
-
После завершения еще
SpringApplicationRunListener
для отправки сообщения environmentPrepared -
Создайте
ApplicationContext
-
инициализация
ApplicationContext
и установите среду, загрузите конфигурацию и т. д. -
Зависит от
SpringApplicationRunListener
выдаватьcontextPrepared
сообщение, которое сообщает приложению SpringBoot использоватьApplicationContext
готов ОК -
Загрузите различные бобы в
ApplicationContext
, продолжить поSpringApplicationRunListener
выдать сообщение contextLoaded, чтобы сообщить приложению SpringBoot оApplicationContext
Заполнено ОК -
обновить ApplicationContext, последний шаг, когда контейнер IoC доступен
-
Зависит от
SpringApplicationRunListener
выдать запущенное сообщение -
Завершите окончательный запуск программы
-
Зависит от
SpringApplicationRunListener
для выдачи рабочего сообщения, чтобы сообщить, что программа работает
На этом весь процесс закончен!
постскриптум
Из-за ограниченных возможностей, если есть ошибки или неуместность, пожалуйста, критикуйте и исправьте их, учитесь и обменивайтесь мнениями вместе!
МожетНажмитеилисканированиеследующеебудь остороженподписаться на официальный аккаунт автораCodeSheep, получить большеПрагматичный, понятный, воспроизводимыйИсходный текст ↓↓↓