Научите вас, как написать стартер в Springboot

задняя часть

Введение

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

2. Объяснение концепции

В pom-файле проекта Springboot вы найдете множество pom-пакетов со стартером, что также является типичной особенностью Springboot. Как это используется?

Наиболее распространенные стартеры для разработки Springboot:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>

Введение этой зависимости maven в основном удовлетворяет ежедневную разработку веб-интерфейса.Когда springboot не используется, необходимо ввести spring-web, spring-webmvc, spring-aop и т. д. для поддержки разработки проекта.

Для некоторых других стартеров, таких как использование redis, jpa и т. д., необходимо не только ввести зависимости, но и реализовать некоторые начальные конфигурации, такие как @Configuration, которые будут созданы при запуске springboot. при условии, чтоspringboot@EnableAutoConfiguration настроен. Класс запуска Springboot по умолчанию имеет значение **@SpringBootApplication.Эта аннотация включена по умолчанию, поэтому нет необходимости отображать введение и, наконец, необходимоstarterпроектДобавьте в META-INF/spring.factories**:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.example.xxx.Xxx

Таким образом, при запуске Springboot конфигурация пользовательского стартера может быть загружена правильно.

Поэтому стартер просто вводит некоторые связанные зависимости и некоторые инициализированные конфигурации.

​ Зачем вы добавили **@ConfigurationАннотацию еще нужно настроитьMETA-INF/spring.factoriesШерстяная ткань? Поскольку проект springboot по умолчаниюСканироваться будут только классы с аннотацией @Configuration в этом проекте**.Если пользовательского стартера нет в этом проекте, его нельзя загрузить, поэтому необходимо настроитьMETA-INF/spring.factoriesконфигурационный файл.

Почему может загружаться файл конфигурации META-INF/spring.factories? Это ключевой момент для Springboot для реализации стартера.Этот метод загрузки конфигурации Springboot представляет собой классМетод SPI (интерфейс поставщика услуг), SPI может настроить класс реализации расширения интерфейса в META-INF/services, принцип аналогичен в springboot, но имя изменено на spring.factories.

Что касается того, как Springboot реализует механизм spi, настоятельно рекомендуется сначала прочитать другой блог блоггера:Прошлая и настоящая жизнь @SpringbootApplication в одной статье, иметь представление о том, как причудливо загружать bean-компоненты в springboot.

3. Определение класса конфигурации

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

В этой статье, чтобы все могли яснее понять использование statrer, вот публичный микросервисный фреймворк, открытый блоггерами на github.модуль общего взаимодействияНапример

адрес проекта:GitHub.com/louyanfeng2…

Я считаю, что каждый должен форматировать данные о дате, возвращаемые на внешний интерфейс или внешний интерфейс на серверную часть в своей повседневной работе, и отображать их какyyyy-MM-dd HH:mm:ssформат. Обычный формат времени для анализа входных и выходных параметров в Springboot может использовать **@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss"). Это предельный входящийyyyy-MM-dd HH:mm:ssстрока, ее можно сопоставить с серверной частьюТип LocalDateTime**.

​ Но одна из проблем заключается в том, что у меня много мест для ввода и вывода форматирования даты.Если мне придется иметь дело с каждым местом отдельно, будет много аннотаций на классе сущности. Основываясь на том принципе, что соглашение Springboot выше, чем конфигурация, мы должны быть соглашением о внешнем интерфейсе.Для взаимодействия с датой мы используемyyyy-MM-dd HH:mm:ssформат, то как с ним бороться глобально?

Добавить глобальную конфигурацию сериализации jackson** [springboot по умолчанию использует jackson для сериализации и десериализации]**

/**
     * 全局时间格式化
     */
    @Bean
    public Jackson2ObjectMapperBuilderCustomizer customizer() {
        return builder -> {
            builder.simpleDateFormat(dateTimeFormat);
            //日期序列化
            builder.serializers(new LocalTimeSerializer(DateTimeFormatter.ofPattern(timeFormat)));
            builder.serializers(new LocalDateSerializer(DateTimeFormatter.ofPattern(dateFormat)));
            builder.serializers(new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(dateTimeFormat)));
            //日期反序列化
            builder.deserializers(new LocalTimeDeserializer(DateTimeFormatter.ofPattern(timeFormat)));
            builder.deserializers(new LocalDateDeserializer(DateTimeFormatter.ofPattern(dateFormat)));
            builder.deserializers(new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(dateTimeFormat)));
        };
    }

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

Определено, что bean-компонент не может быть загружен с помощью Springboot и требует **@Configuration** для совместного использования.

@Configuration
public class CommonJacksonConfig {

    public static final String timeFormat = "HH:mm:ss";
    public static final String dateFormat = "yyyy-MM-dd";
    public static final String dateTimeFormat = "yyyy-MM-dd HH:mm:ss";

    /**
     * 全局时间格式化
     */
    @Bean
    public Jackson2ObjectMapperBuilderCustomizer customizer() {
        return builder -> {
            builder.simpleDateFormat(dateTimeFormat);
            //日期序列化
            builder.serializers(new LocalTimeSerializer(DateTimeFormatter.ofPattern(timeFormat)));
            builder.serializers(new LocalDateSerializer(DateTimeFormatter.ofPattern(dateFormat)));
            builder.serializers(new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(dateTimeFormat)));
            //日期反序列化
            builder.deserializers(new LocalTimeDeserializer(DateTimeFormatter.ofPattern(timeFormat)));
            builder.deserializers(new LocalDateDeserializer(DateTimeFormatter.ofPattern(dateFormat)));
            builder.deserializers(new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(dateTimeFormat)));
        };
    }
}

4. Настройка Spring.Factory

После определения класса конфигурации вам необходимо предоставить bean-компонент. Причина этого также в том, что **@SpringbootApplicationОтмеченный класс, если путь пакета для сканирования не определен, по умолчанию используется сканированиеПуть к пакету, в котором расположены классы, аннотированные @SpringbootApplication. Вот почему официально рекомендуется размещать класс запуска в самом внешнем пакете, чтобы гарантировать, что bean-компоненты, определенные bean-компонентами, определенными в текущем проекте, могут быть отсканированы и загружены Springboot.

​ НовыйresourcesСоздайте новый файл **/META-INF/spring.factories** в каталоге и добавьте конфигурацию

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.baiyan.common.interaction.config.CommonJacksonConfig

5. Выборочная загрузка и дополнительная настройка

После вышеперечисленных действий класс автоматической настройки готов. Но здесь есть еще две проблемы.

5.1 Выборочная загрузка

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

@ConditionalOnProperty(value = "common.config.jackson.enable", havingValue = "true")

Это настраивается только в файле конфигурацииcommon.config.jackson.enableдляtrueЭтот класс конфигурации будет загружен только в это время и не будет загружен, если по умолчанию нет конфигурации или если конфигурация не является ложной.

5.2. Дополнительная конфигурация

Если в начале слишком много бобов, мы определяем. Но большинство бинов взаимозависимы:

  • Например, А зависит от В, а В зависит от С.

  • Например, достоверность A зависит от того, есть ли в проекте класс B или компонент C.

  • ...

    В настоящее время вы можете использовать аннотацию @Import для загрузки связанного класса конфигурации и использовать **@ConditionalOnBean**, чтобы решить, следует ли загружать соответствующую конфигурацию.

6. Нажмите

​ На пятом шаге был создан стартер.Вы можете использовать maven для отправки определенного вами стартера на частный склад компании, чтобы другие проекты могли напрямую вводить загруженную вами конфигурацию maven. Если для загрузки bean-компонента не используется условное решение, конфигурация может быть загружена путем непосредственного запуска проекта. В противном случае добавьте соответствующую конфигурацию.

7. Ссылки и цитаты

Введение в принцип стартера в SpringBoot

8. Свяжитесь со мной

Если вы считаете, что статья хорошо написана, вы можете поставить лайк и прокомментировать + подписаться на Санлиана, хорошо~

Диндин: louyanfeng25

WeChat: baiyan_lou