5 точек расширения SpringBoot, супер практично!
5 точек расширения SpringBoot, супер практично!
1. ИнициализаторApplicationContextInitializer
Когда мы запускаем проект Spring Boot, мы выполняем такой метод, чтобы запустить его.

Мы щелкали слой за слоем и, наконец, обнаружили, что этот метод был выполнен.

Итак, когда мы запускаем проект, мы также можем запустить его вот так new SpringApplication(SpringbootExtensionPointApplication.class).run(args); Старый просто оборачивает статический метод. Фактический нижний уровень предназначен для создания экземпляра объекта SpringApplication и последующего вызова его метода запуска.

Давайте перейдем к методу построения и посмотрим. Один из них, отмеченный красным прямоугольником, предназначен для установки инициализатора, а другой — для установки прослушивателя.

Щелкните и посмотрите. Два базовых метода одинаковы: передать тип и найти класс реализации этого типа через Spring SPI.

Создайте точку останова и запустите ее. На данный момент имеется 7 инициализаторов контекста, которые поставляются с системой и настраиваются в разных файлах Spring.factories.

Теперь я хочу создать новый собственный инициализатор

Что мне теперь делать, чтобы позволить Spring Boot сканировать созданный мной инициализатор при его запуске? Просто добавьте его в файл Spring.factories и зарегистрируйте, чтобы его можно было сканировать. Это SPI. SPI означает интерфейс поставщика услуг, который представляет собой механизм обнаружения служб.

Тогда давайте начнем весну снова в это время Boot,Нашел то, что создалApplicationContextInitializerУже зарегистрирован,Стало 8.

Освободите точку останова,Это предложение также выводится в консоли,Тогда это первая точка расширенияApplicationContextInitializer

Эти 8 инициализаторов определены, значит должно быть где-то их настроить, иначе как их можно было распечатать Так где же именно они настраиваются? Разбиваем точку на собственном инициализаторе и видим, что она зашла., а потом смотрим? в информации о стеке ниже, именно здесь выполняется вызов.

Оказывается, это называлосьrun()метод中изprepareContext()метод中изapplyInitializers()метод,существовать这个метод中for循环из调用各个初始化器изinitialize()метод,Таким образом, мы можем увидетьJackизApplicationContextInitializerЭто предложение было распечатано。

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

Итак, наконец, давайте посмотрим на расположение нашей первой точки расширения.

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

2. Приложение-прослушивательListener

В приведенном выше конструкторе мы обнаружили, что помимо setInitializers есть еще setListeners, поэтому этот прослушиватель на самом деле является точкой расширения.

Так что же такое слушатель?,Вот и все,На самом деле это режим наблюдателя,ApplicationEventMulticasterвыпускатьсобытие,Каждый слушатель отслеживает событие.

Как и инициализатор, теперь мы настраиваем два прослушивателя, один — Starting, а другой — Started. Тот, что в скобках, — общий. Если не написано, независимо от типа события, он будет слушать.

Этот универсальный вариант представляет собой событие, верхний предел которого — тип ApplicationEvent. Существует множество конкретных классов реализации, и Starting и Started — лишь два из них.

Теперь мы еще добавляем эти два слушателя в конфигурацию через SPI.

Хорошо, давайте запустим. Мы видим, что эти два предложения были напечатаны.

То же, что слушатель,Поскольку его можно распечатать,Должно быть, кто-то звонит,так что мыJackStartingApplicationListenerСделать точку останова,Затем посмотрите информацию о стеке

мы можем увидеть вSpringApplication run()методизlisteners.starting()Начать отправкуApplicationStartingEventтранслироватьсобытие,Наконец опубликуйте это,Получено нашим прослушивателем событий.

ТакApplicationStartedEventсобытие也是一样из道理,Найдите вызывающего абонента через точки останова,Наконец, давайте сейчас посмотрим на диаграмму точек расширения.

3、Runner

мы видим вlisteners.started()Есть один позадиcallRunners

Давайте нажмем и посмотрим,На самом деле он получает два типа Runner из контейнера.,Один из нихApplicationRunner,Еще одинCommandLineRunner,Затем вызовите их в цикле for,Так что на самом деле это тоже точка расширения

Давайте напишем наш собственный Runner

Запустите его и посмотрите, что напечатает.

Тогда общий сценарий применения этого Runner — это освобождение и очистка ресурсов или центр регистрации, поскольку проект запускается при выполнении Runner, и в это время его можно зарегистрировать в центре регистрации. На этом этапе давайте еще раз посмотрим на диаграмму точек расширения.

4、BeanFactoryPostProcessor

Давайте посмотримrunметод里изrefreshContext()метод

这个метод底层会调spring里面изrefresh()метод,这个метод里面就会做对контейнериз初始化。红框里изinvokeBeanFactoryPostProcessors()метод,Здесь также есть точка расширения,то естьBeanFactoryPostProcessor,ВыполнятьBeanFactoryиз后置处理。Spring Bootанализировать КонфигурациястановитьсяBeanDefinitionиз操作也是существовать此метод中。

现существовать我们来创建一个自己изBeanFactoryPostProcessor,В этом методе вы можете изменить свойства beanFactory.,beanfactoryЕстьBeanDefinition,Может быть измененBeanDefinition里面из值。BeanDefinitionэтоbeanиз元数据из信息,Сколько ихbean就Сколько ихBeanDefinition

Запустите его, и он также будет распечатан.

На этом этапе мы снова смотрим на диаграмму точек расширения, которая становится все более совершенной.

5、BeanPostProcessor

最后介绍из是BeanPostProcessor,Он выполняется после создания экземпляра компонента через отражающий конструктор.,Так红框里面标出来изregisterBeanPostProcessors()методто есть向BeanFactoryЗарегистрируйтесь вbeanpostprocessor,Операции перехвата, используемые для последующего создания компонента.

现существовать我们来创建一个自己изBeanPostProcessor,Всего есть два метода,postProcessBeforeInitializationиpostProcessAfterInitialization,Но мы обычно используемpostProcessAfterInitialization,существоватьbeanВыполняется после вызова отражающего конструктора и создания его экземпляра.。著名из应用场景AOP底层то есть通过BeanPostProcessor来实现из。

现существовать我существоватьpostProcessAfterInitialization上Сделать точку останова,Посмотрите, где вызывается информация стека.

是существоватьfinishBeanFactoryInitialization()метод处调用из

6. Постскриптум

Наконец, я дополню диаграмму точек расширения, как показано ниже. Она очень ясна и понятна. Что называется когда? Когда мы сами ее разрабатываем, мы объединяем сценарии приложения и знаем, какой тип точки расширения создавать, когда нам нужно. сделать что-нибудь.

Первые три этой статьи рассказывают о точках расширения в Spring Boot. Последние две — это точки расширения в Spring, потому что нижний уровень Spring Boot — это исходный код Spring, поэтому они являются точками расширения в Spring. таким образом, в Spring все еще есть точки расширения. Многие точки расширения, такие как InitializeBean, Aware и т. д., здесь не упоминаются, ожидая, пока все обнаружат ~.

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