Научите, как настроить стандартный стартер Spring Boot, это действительно понятно

Spring Boot
Научите, как настроить стандартный стартер Spring Boot, это действительно понятно

написать впереди

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

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

В Spring Boot термин, используемый для обозначения модуля, который обеспечивает такие сквозные функции, называетсяstarter, вы можете легко использовать некоторые из его функций, полагаясь на стартер,Вы создаете свой собственный стартер в своей работе, вы должны иметь идею создания «стартера»В этой статье мы создадим простой Starter в сочетании с официальными стандартами Spring Boot.

пользовательский стартер

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

Обычно полный стартер должен содержать следующие два компонента:

  1. Auto-Configure Module
  2. Starter Module

Если вы видите, что объяснения двух компонентов ниже несколько абстрактны, у вас будет общее понимание.После прочтения статьи вы будете просветлены, когда вернетесь сюда.

Auto-Configure Module

Модуль автоконфигурации — это модуль Maven или Gradle, который содержит классы автоконфигурации. Этим способом,Мы можем создавать модули, которые могут автоматически вносить вклад в контекст приложения, а также добавлять функцию или предоставлять доступ к внешней библиотеке.

Starter Module

Spring Boot Starter — это модуль Maven или Gradle, единственной целью которого является предоставление всех зависимостей, необходимых для «запуска» функции. Может содержать одну или несколько зависимостей модуля автоматической настройки, а также любые другие зависимости, которые могут потребоваться. Таким образом, в загрузочном приложении Spring нам нужно только добавить эту начальную зависимость, чтобы использовать ее функции.

⚠️: Официальное справочное руководство Spring рекомендует отделить автоконфигурацию и запускать каждую автоконфигурацию в отдельный модуль Maven или Gradle, тем самым разделив автоконфигурацию и управление зависимостями. Если вы не создаете библиотеку с открытым исходным кодом, которую используют тысячи пользователей, вы также можете объединить их в один модуль.You may combine the auto-configuration code and the dependency management in a single module if you do not need to separate those two concerns

название

Все официальные стартеры Spring начинаются сspring-boot-starterв начале, например:

  • spring-boot-starter-web
  • spring-boot-starter-aop

Если мы настроим имя стартовой функции под названиемacmeТогда наше имя это:

  • acme-spring-boot-starter
  • acme-spring-boot-autoconfigure

Если в пусковом устройстве используются ключи конфигурации, будьте осторожны, чтобы не использовать пространства имен, используемые Spring Boot, например (сервер, управление, весна)

Создание родительского модуля

Давайте посмотрим на структуру проекта в целом: Структура каталогов первого уровня:

.
├── pom.xml
├── rgyb-spring-boot-autoconfigure
├── rgyb-spring-boot-sample
└── rgyb-spring-boot-starter

Вторичная структура каталогов:

.
├── pom.xml
├── rgyb-spring-boot-autoconfigure
│   ├── pom.xml
│   └── src
├── rgyb-spring-boot-sample
│   ├── pom.xml
│   └── src
└── rgyb-spring-boot-starter
    ├── pom.xml
    └── src

Создайте пустой родительский модуль Maven, который в основном обеспечивает управление зависимостями, чтобы SubModule не нужно было отдельно поддерживать номер версии зависимости, посмотрите содержимое pom.xml:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>${spring-boot.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>

    <!--  添加其他全局依赖管理到这里,submodule默认不引入这些依赖,需要显式的指定  -->
</dependencyManagement>

Сборка модуля автоматической настройки

новый классGreetingAutoConfiguration

@Configuration
public class GreetingAutoConfiguration {

	@Bean
	public GreetingService greetingService(GreetingProperties greetingProperties){
		return new GreetingService(greetingProperties.getMembers());
	}
}

мы используем@ConfigurationАннотация помечает класс GreetingAutoConfiguration как точку входа для стартера. Эта конфигурация содержит все необходимое для предоставления начальных функций.@BeanОпределение, в этом примере для простоты мы просто добавляем Бин GreetingService в контекст приложения.

Содержимое GreetingService выглядит следующим образом:

@AllArgsConstructor
public class GreetingService {

	private List<String> members = new ArrayList<>();

	public void sayHello(){
		members.forEach(s -> System.out.println("hello " + s));
	}
}

Создайте новый файл в каталоге ресурсовMETA-INF/spring.factories(если каталогMETA-INFВручную создавать не нужно), запишите содержимое в файл:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
 top.dayarch.autoconfigure.GreetingAutoConfiguration

Весна начинается со всехspring.factoreisфайл и загрузите конфигурацию объявления внутри. После того, как класс GreetingAutoConfiguration готов, наш Spring Boot Starter имеет автоматически активируемую точку входа

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

Условная конфигурация

Добавьте в класс две условные аннотации:

@Configuration
@ConditionalOnProperty(value = "rgyb.greeting.enable", havingValue = "true")
@ConditionalOnClass(DummyEmail.class)
public class GreetingAutoConfiguration {
    ...
}
  • используя@ConditionalOnPropertyАннотация, мы говорим Spring, что только свойстваrgyb.greeting.enableGreetingAutoConfiguration (и все bean-компоненты, которые он объявляет) включается в контекст приложения, когда для значения установлено значение true.
  • используя@ConditionalOnClassаннотацию, мы говорим Spring включить GreetingAutoConfiguration (и все bean-компоненты, которые он объявляет) в контекст приложения, только если класс DummyEmail.class существует в пути к классам.

Несколько условийand/与Связь GreetingAutoConfiguration будет загружена только при соблюдении всех условий.

Если вы не уверены в использовании условных аннотаций, ознакомьтесь с моей предыдущей статьей:@ Кондиционная аннотация, гибкая конфигурация весенний ботинок

Управление свойствами конфигурации

использовано выше@ConditionalOnPropertyОбратите внимание, что в фактическом стартере может быть много свойств, поэтому нам нужно управлять этими свойствами централизованно:

@Data
@ConfigurationProperties(prefix = "rgyb.greeting")
public class GreetingProperties {

	/**
	 * GreetingProperties 开关
	 */
	boolean enable = false;

	/**
	 * 需要打招呼的成员列表
	 */
	List<String> members = new ArrayList<>();
}

Мы знаем, что эти свойства должны использоваться в application.yml.Когда нам нужно использовать эти свойства, чтобы IDE выдавала более понятные подсказки, нам нужно добавить зависимости в pom.xml:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

Таким образом, когда мы компилируем mvn, он сгенерирует файл с именемspring-configuration-metadata.jsonJSON-файл со следующим содержимым:

Созданный контент используется в следующем контенте, и см.

Улучшить время запуска

Для каждого автоматически настроенного класса в пути к классам Spring Boot должен вычислить@Conditional…Условное значение, чтобы решить, следует ли загружать автоконфигурацию и все необходимые классы. В зависимости от размера и количества стартеров в приложении загрузки Spring это может быть очень дорогостоящей операцией и может повлиять на время запуска. Чтобы улучшить время запуска, нам нужно добавьте еще одну зависимость в pom.xml:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-autoconfigure-processor</artifactId>
    <optional>true</optional>
</dependency>

Эта аннотация создаст файл с именемspring-autoconfigure-metadata.propertiesФайл свойств со следующим содержимым:

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

На этом этапе модуль автоконфигурации построен, и нам нужно продолжить строительство начального модуля.

Сборка стартового модуля

Конструкция начального модуля очень проста. Вы можете думать о нем как о пустом модуле. За исключением использования модуля автоматической настройки, его единственная функция состоит в том, чтобы предоставить все необходимые зависимости для использования начальных функций, поэтому мы добавляем следуя файлу pom.xml начального модуля.content:

<dependencies>
    <dependency>
        <groupId>top.dayarch.learnings</groupId>
        <artifactId>rgyb-spring-boot-autoconfigure</artifactId>
        <version>1.0.0.RELEASE</version>
    </dependency>

    <!-- 在此处添加其他必要依赖,保证starter可用 -->
</dependencies>

Также создайте новый файл в каталоге ресурсовMETA-INF/spring.providers, содержание которого следующее:

providers: rgyb-spring-boot-autoconfigure

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

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

Создать образец модуля

Обычно мы можем инициализировать проект Spring Boot (rgyb-spring-boot-sample) через Spring Initializr, импортировать только что созданную стартовую зависимость и добавить зависимость в образец pom.xml:

<dependency>
    <groupId>top.dayarch.learnings</groupId>
    <artifactId>rgyb-spring-boot-starter</artifactId>
    <version>1.0.0.RELEASE</version>
</dependency>

Затем настройте свойства application.yml.

rgyb:
  greeting:
    enable: true
    members:
      - 李雷
      - 韩梅梅

Когда мы настроим YAML, появится подсказка, показанная на рисунке ниже, которая будет более дружелюбной. Конечно, для уточнения описание атрибута лучше всего описать на английском языке. Вот описание на китайском языке, чтобы проиллюстрировать проблему:

написать тестовый класс

Пишем тест-кейсы:

@Autowired(required = false)
private GreetingService greetingService;

@Test
public void testGreeting() {
    greetingService.sayHello();
}

Результаты теста следующие:

hello 李雷
hello 韩梅梅

Суммировать

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

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

Описание точки знаний

Dependency optinal

Почему модуль автоматической настройки зависимостей является необязательным = правда? Это связано с проблемами транзитивных зависимостей Maven, деталямиТщательное понимание транзитивности зависимости Maven

spring.factories

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

Откройте класс SpringFactoriesLoader, и вот что бросается в глаза:

Этих двух картинок должно быть достаточно, чтобы проиллюстрировать проблему.Это метод загрузки SPI.Более подробно, пожалуйста, узнайте сами.

фактический случай

Рекомендуем посмотреть здесьmybatis-spring-boot-starterЭто неофициальный весенний чехол, из которого мы:

  • Имитация структуры каталогов
  • Имитировать его концепцию дизайна
  • Подражайте его соглашению о кодировании

Кроме того, я загрузил случай этой статьи, официальный аккаунт ответит «демо», откройте ссылку и просмотрите содержимое в каталоге customstarter.

вопрос души

  1. Почему содержимое @ConditionalOnProperty не записывается при создании файла spring-autoconfigure-metadata.properties
  2. Если мы хотим загрузить зависимости в удаленный центральный репозиторий, знаете ли вы, как создать собственный репозиторий maven?
  3. Ваши фонари все еще горят?

Блог был переработан, чтобы узнать больше интересных вещей заранее, пожалуйста, посетите:dayarch.top

Добро пожаловать, чтобы продолжать обращать внимание на общественный номер: «Сун Гун И Бин».

  • Передовая технология Java для обмена галантереей
  • Резюме эффективных инструментов | Ответ на «Инструменты»
  • Анализ вопроса интервью и ответ
  • Сбор технических данных | Ответ "Информация"

Learn about the Java technology stack with ease and fun with the thinking of reading detective novels, and gradually decompose technical problems based on the principles of simplification of complex problems, specificization of abstract problems and graphics. The technology is continuously updated, please continue to pay внимание...