Примечание. Анализ исходного кода соответствует SpringBoot версии 2.1.0.RELEASE.
1 Уроки прошлого
Эта статья продолжаетКак значения свойств внешней конфигурации привязаны к свойствам класса XxxProperties? --Исходный код SpringBoot (5)
Ознакомившись с прошлым и узнав новое, давайте кратко повторим содержание предыдущей статьи, в которой мы разобрали SpringBootКак значения свойств внешней конфигурации привязаны к свойствам класса XxxPropertiesСоответствующий исходный код, важные этапы привязки внешних свойств резюмируются следующим образом:
- прежде всего
@EnableConfigurationProperties
аннотацияimport
охватыватьEnableConfigurationPropertiesImportSelector
постпроцессор; -
EnableConfigurationPropertiesImportSelector
постпроцессор вSpring
зарегистрирован в контейнереConfigurationPropertiesBeanRegistrar
иConfigurationPropertiesBindingPostProcessorRegistrar
эти двоеbean
; - в
ConfigurationPropertiesBeanRegistrar
В направленииSpring
зарегистрирован в контейнереXxxProperties
Типbean
;ConfigurationPropertiesBindingPostProcessorRegistrar
В направленииSpring
зарегистрирован в контейнереConfigurationBeanFactoryMetadata
иConfigurationPropertiesBindingPostProcessor
Два задних процессора; -
ConfigurationBeanFactoryMetadata
Постпроцессор инициализируетсяbean
factory
когда@Bean
Метаданные аннотации сохраняются для использования в связанной логике последующей привязки атрибутов внешней конфигурации; -
ConfigurationPropertiesBindingPostProcessor
Постпроцессоры привязывают значения свойств внешней конфигурации кXxxProperties
Логика свойства класса делегируетсяConfigurationPropertiesBinder
объект, тоConfigurationPropertiesBinder
Объекты и в конечном итоге делегировать привязку логической логикиBinder
объект для завершения.
Видно, что главное вышеШаг 5.
2 Введение
Все мы знаем, что SpringBoot имеет встроенные различныеStarter
Запуск зависимостей нам очень удобно использовать, что значительно сокращает нашу работу по разработке. имеютStarter
Запуская зависимости, нам не нужно думать о том, какая библиотека нужна этому проекту, библиотекаgroupId
иartifactId
что это? Не беспокойтесь о том, не будет ли он конфликтовать с другими зависимостями после импорта этой версии библиотеки.
взять каштан: Сейчас мы хотим разработать веб-проект, тогда просто импортируем
spring-boot-starter-web
Этой стартовой зависимости достаточно, не нужно думать, какие версии каких зависимостей вводить. Как и прежде, нам также необходимо рассмотреть, какие зависимые библиотеки ввести, например, ввестиspring-web
иspring-webmvc
Зависимости и т.п., кроме того, необходимо также учитывать, какие версии этих библиотек внедряются, чтобы они не конфликтовали с другими библиотеками.
Поэтому мы пока не будем анализировать исходный код автоматической настройки SpringBoot.Поскольку взаимосвязь между зависимостями при запуске и автоматической настройкой тесно связана, в этой статье мы сначала рассмотрим построение проекта maven для анализа макроскопического анализа, который мы обычно используют.Различные встроенные SpringBootStarter
Как он устроен?
3 необязательных тега Maven для транзитивных зависимостей
При анализе различных встроенных в SpringBootStarter
Прежде чем строить принцип, давайте сначала разберемся с Maven.optional
ярлык, потому что этот ярлык играет жизненно важную роль.
знатокoptional
Метка представляет значение необязательной зависимости, то есть нетранзитивной.Ниже приведен каштан для иллюстрации.
Такие какA
,B
иC
три библиотеки,C
полагатьсяB
,B
полагатьсяA
. Давайте взглянем на три библиотеки нижеpom.xml
документ:
// A的pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<groupId>com.ymbj</groupId>
<artifactId>A</artifactId>
<version>1.0-SNAPSHOT</version>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<groupId>com.ymbj</groupId>
<artifactId>B</artifactId>
<version>1.0-SNAPSHOT</version>
<!--注意是可选依赖-->
<dependencies>
<dependency>
<groupId>com.ymbj</groupId>
<artifactId>A</artifactId>
<version>1.0-SNAPSHOT</version>
<optional>true</optional>
</dependency>
</dependencies>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<groupId>com.ymbj</groupId>
<artifactId>C</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.ymbj</groupId>
<artifactId>B</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
тройка лидеровA
,B
иC
библиотекаpom.xml
знать,B
библиотечные зависимостиA
библиотека, затемC
Библиотека снова зависитB
библиотека, то подумай об этом,Пакетная сборка MavenC
После библиотеки,A
Библиотека была импортирована?
Ответ определеннонет,так какB
импорт библиотекиA
используются библиотечные зависимости<optional>true</optional>
, подходя к Мавенуoptional
Значение метки установлено наtrue
,В настоящее времяC
повторное введение библиотекиB
библиотечные зависимости,A
Библиотеки не импортируются вC
библиотека.
В то же время есть еще один, связанный с транзитивными зависимостями Maven.exclusions
Метка, что означает исключение подзависимости библиотеки, которая здесь подробно описываться не будет.
4 Как устроены различные Starters, созданные в SpringBoot?
Теперь давайте изучим различные встроенные средства SpringBoot.Starter
В конце концов, как его построить?
все еще помнюКак анализировать модули и структуру исходного кода SpringBoot?В этой статье анализируются отношения между модулями в SpringBoot? Давайте рассмотрим внутреннюю диаграмму модулей исходного кода SpringBoot:
Рисунок 1Мы все знаем, что SpringBootStarter
Суть принципа построения заключается в автоматической настройке, поэтому из рисунка 1 вы можете увидеть внутреннее продолжение исходного кода проекта SpringBoot.Starter
Есть четыре модуля, связанные с его автоматической настройкой:spring-boot-starters
,spring-boot-actuator-autoconfigure
,spring-boot-autoconfigure
иspring-boot-test-autoconfigure
. Пожалуйста, ознакомьтесь с ролью каждого модуляКак анализировать модули и структуру исходного кода SpringBoot?Эта статья не будет повторяться здесь.
Так,spring-boot-starters
Модули связаны со следующими тремя модулями автоконфигурации.xxx-autoconfigure
Какая связь между модулями?
Теперь давайте посмотримspring-boot-starters
Какова структура модуля?
Из рисунка 2 видно, чтоspring-boot-starters
Модуль содержит различные встроенные SpringBootstarter
:spring-boot-starter-xxx
. Из-за различных встроенных в SpringBootstarter
слишком много, с нашим обычнымspring-boot-starter-web
Начните полагаться на исследования.
давайте сначала посмотримspring-boot-starter-web
Внутренняя структура модуля:
можно увидетьspring-boot-starter-web
Только внутри модуля.flattened-pom.xml
иpom.xml
документ,без кода! Немного неожиданно. Мы все знаем, что когда мы хотим использовать веб-функции SpringBoot, нам нужно ввестиspring-boot-starter-web
Вы можете начать полагаться на него, и теперьspring-boot-starter-web
В модуле нет строки кода, тогдаspring-boot-starter-web
Как именно он устроен? Будет ли он таким же, как показано на рисунке 1?spring-boot-autoconfigure
Модуль автоконфигурации связан?
В этот момент нам нужно посмотреть наspring-boot-starter-web
модульныйpom.xml
содержание документа:
Как видно из рисунка 4,spring-boot-starter-web
модуль зависит отspring-boot-starter
,spring-boot-starter-tomcat
,spring-web
иspring-webmvc
Ожидание модуля, зависимости нетspring-boot-autoconfigure
Автоматически настраивайте модули!
так какspring-boot-starter-web
Модуль должен следоватьspring-boot-autoconfigure
связанных с модулями автоконфигурации, поэтомуspring-boot-starter-web
Модуль должен быть косвенно зависимspring-boot-autoconfigure
Автоматически настраивать модули.
Рисунок 4 Отмечен меткой «В фокусе»spring-boot-starter
Модули составляют подавляющее большинствоspring-boot-starter-xxx
Базовый модуль, от которого зависит модуль, является ядромStarter
, включая автоматическую настройку, ведение журнала иYAML
служба поддержки. давайте обратим вниманиеspring-boot-starter
изpom.xml
файл, возможно, это зависит отspring-boot-autoconfigure
Автоматически настраивать модули.
Как видно из рисунка 5, наша предыдущая гипотеза не является ошибочной.точноspring-boot-starter
модуль зависит отspring-boot-autoconfigure
Автоматически настраивайте модули!Итак, здесь мы можем сделать вывод:spring-boot-starter-web
В модуле нет ни строчки кода, но он проходитspring-boot-starter
модулькосвенныйзависел отspring-boot-autoconfigure
Модуль автоматически настраивается для реализации функций, от которых он зависит при запуске.
Теперь давайте посмотрим наspring-boot-autoconfigure
Внутренняя структура пакета модуля автоконфигурации:
Из красного прямоугольника на рис. 6 мы можем узнать, чтоspring-boot-starter-web
Функция автоконфигурации зависимостей запуска изначально была созданаspring-boot-autoconfigure
модульныйweb
Реализован классами под пакетом.
иди тудаspring-boot-starter-web
Мы разобрались с основными принципами построения стартовых зависимостей, но есть особенно важный ключевой момент, до которого мы еще не добрались. Этот ключевой момент похож на Mavenoptional
Этикетки играют свою роль.
Чтобы добраться до этого момента, давайте сначала подумаем о проблеме: обычно мы разрабатываемweb
Почему был представлен проект?spring-boot-starter-web
После этой начальной зависимостиspring-boot-autoconfigure
модульныйweb
Будут ли соответствующие классы автоконфигурации работать автоматически?
Мы должны знать, что класс автоматической настройки часто работает из-заclasspath
Есть класс вDispatcherServletAutoConfiguration
Этот класс автоматически настраивается как точка входа, чтобы лучше понять суть.
Первый взглядDispatcherServletAutoConfiguration
Каковы условия автоматической настройки?
Как показано на рисунке 7,DispatcherServletAutoConfiguration
Одним из условий возможности автоматической настройки является@ConditionalOnClass(DispatcherServlet.class)
, то есть толькоclasspath
существуют вDispatcherServlet.class
Этот класс,DispatcherServletAutoConfiguration
Автоматическая логика, связанная с конфигурацией, для работы.
иDispatcherServlet
Этот класс находится вspring-webmvc
В этой библиотеке зависимостей, как показано на следующем рисунке:
Теперь давайте посмотрим наspring-boot-autoconfigure
модульныйpom.xml
Введение в файлspring-webmvc
Случай этой зависимости:
Как показано на рисунке 9,spring-boot-autoconfigure
модуль импортированspring-webmvc
Когда эта зависимостьoptional
установить какtrue
, оказывается необязательной зависимостью. которыйspring-webmvc
Эта зависимая библиотека будет импортирована только вspring-boot-autoconfigure
модули без импорта в косвенные зависимостиspring-boot-autoconfigure
модульныйspring-boot-starter-web
Это начало зависит от.
В этот момент давайте посмотрим наspring-boot-starter-web
изpom.xml
Зависимости файлов:
Как показано на рисунке 10,spring-boot-starter-web
Зависит от запускаявныйпредставилspring-webmvc
Эта библиотека зависимостей, то есть введениеspring-webmvc
нетoptional
Этот ярлык, и потомуDispatcherServlet
Этот класс находится вspring-webmvc
в этой библиотеке зависимостей, таким образомclasspath
существуют вDispatcherServlet
этот класс, поэтомуDispatcherServletAutoConfiguration
Этот класс автоматической настройки вступает в силу. Конечно,web
Это также принцип других классов автоматической конфигурации.
На данный момент мы также понимаемspring-boot-autoconfigure
Почему модуль должен быть импортирован?spring-webmvc
Эта зависимость является необязательной, и ее цель состоит в том, чтобыspring-boot-starter-web
Может быть явно введен в начальных зависимостяхspring-webmvc
Эта зависимость (это играет решающую роль), поэтому нам нужно только представить веб-проектspring-boot-starter-web
Зависимости запуска, тогда вступят в силу классы автоматической настройки, связанные с веб-сайтом, так что вы сможете использовать их сразу после установки.spring-boot-starter-web
Принцип построения этой пусковой зависимости.
упоминалось ранееspring-boot-starter-actuator
,spring-boot-starter-test
и другие встроенныеspring-boot-starter-xxx
То же верно и для принципа построения исходных зависимостей, за исключением того, чтоspring-boot-starter-actuator
зависит отspring-boot-actuator-autoconfigure
,spring-boot-starter-test
зависит отspring-boot-test-autoconfigure
Это всего лишь модуль, поэтому я не буду вдаваться в подробности.
считать:
spring-boot-actuator-autoconfigure
изpom.xml
Файл представляет более 20 необязательных зависимостей, и почемуspring-boot-starter-actuator
Зависимости запуска только вводятсяmicrometer-core
А как быть с этой зависимостью?
5 Настройте Starter, имитируя структуру пакета SpringBoot
Предыдущий анализ различных встроенных SpringBootStarter
Принцип построения, теория и практика, то если можно попрактиковаться на заказStarter
Даже лучше.
Ниже приведен обычайStarter
простоDemo
,этоDemo
полная имитацияSpringBoot
встроенныйStarter
Внутреннюю структуру пакета написать, чтобы узнать больше о различных встроенных SpringBootStarter
Полезен принцип построения.
Ниже этоDemo
Адрес github рекомендуется заинтересованным друзьям.Настройте Starter, имитируя внутреннюю структуру Springboot.. Кроме того, как настроить одинStarter
, вы можете обратиться к Mybatisspring-boot-starterКак писать.
6 Резюме
Ну и всякие встроенные в SpringBootStarter
Это конец разбора принципа построения , теперь резюмируем ключевые моменты:
-
spring-boot-starter-xxx
Начальные зависимости не имеют ни строчки кода, а прямо или косвенно зависятxxx-autoconfigure
модуль, покаxxx-autoconfigure
модуль берет на себяspring-boot-starter-xxx
Начните полагаться на реализацию автоматической настройки; -
xxx-autoconfigure
Модули автоматической конфигурации вводят некоторые необязательные зависимости, эти необязательные зависимости не будут переданыspring-boot-starter-xxx
В начальных зависимостях это сборка начальных зависимостей.ключевой момент; -
spring-boot-starter-xxx
Зависит от запускаявныйВведены некоторые необязательные зависимости для работы автоконфигурации; - После первых трех шагов подготовки, пока наш проект вводит начальную зависимость, ее можно использовать «из коробки», вместо того, чтобы вручную создавать некоторые
bean
Ждать.
В связи с ограниченным уровнем автора, если есть ошибки в тексте, просьба указать, спасибо.
Ссылаться на: 1,Глубокое понимание транзитивности зависимостей Maven