Серия Springboot (15) Как написать свой собственный стартер Springboot

Spring Boot

Пишите статьи серьезно и не будьте участником заголовков.

Статья вошла вGitHub.com/Ниу Мух/Java…иБлог программиста Аранга, обратите внимание, не потеряйтесь.

1. Введение

SpringbootАвтоматическая настройка действительно удобна и снижает сложность нашей разработки, так в чем же принцип автоматической настройки? Я уже писал об этом статью.
Серия Springboot (3) Автоматическая конфигурация Spring Boot.

Поскольку автоматическая настройка использует привязку файлов конфигурации, если вы не знаете, как использовать общие файлы конфигурации, вы можете обратиться к этой статье.
Springboot Series (два) весенние загрузочные профили.

На этот раз, изучивSpringbootАвтоматический режим настройки, напишите свойstarter, чтобы углубить ваше понимание автоконфигурации.

Знакомство с шаблонами помогает улучшить письмоstarterнормативный, напишите свойstarterДо первого обученияSpringbootофициальныйstarterи интеграция общих фреймворковstarterВ способе написания можно оценить тайну.

2. Официальный режим Springboot

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

2.1. Введение зависимостей

Прежде чем использовать номер порта, нам нужно импортировать веб-зависимость.

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

если вы наблюдаетеstarterЕсли есть еще, может быть, вы нашли одинмодель,SpringbootОфициальныйstarter именаspring-boot-starter-xxxxназванный.

Проверятьspring-boot-starter-webВы обнаружите, что на самом деле эта зависимость является просто пустой коробкой, если не считать других зависимостей.pomКроме этого, нет ни одной строчки кода.

spring-boot-starter-web

В это время другоймодель:starterзависеть только от другихpomНе занимайтесь реализацией кода.

Такspring-boot-starter-webОт чего это зависит?

spring-boot-starter-web 的依赖

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

  1. полагатьсяspring-boot-starter.
  2. полагатьсяspring-boot-autoconfigure.

2.2. Автоматическая настройка

Импорт зависимости настраивает только номер порта, как здесь.

server.port=8090

ИДЕЯ может нажатьserver.portНайдите файл класса, к которому привязана эта конфигурация. Вы можете видеть, что конфигурация в конечном итоге будет внедрена в классServerPropertiesКатегорияportхарактеристики.

Server 属性配置

тогда этоServerPropertiesГде он используется? продолжай искать, найди иServletродственные звонки.

getPort 的调用

найдено, чтоServletWebServerFactoryCustomizerКласс вызывается, и этот класс определяет

private final ServerProperties serverProperties;

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

ServletWebServerFactoryAutoConfiguration 类

Согласно нашему пониманию аннотации, этот класс является основным классом автоматической настройки. В то же время классы автоматической конфигурацииAutoConfigurationконец.

Посмотрите на значение нескольких аннотаций этого класса.

  1. более высокий приоритет.
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)
  1. только вServletRequestСуществование класса является веб-приложением.
@ConditionalOnClass(ServletRequest.class)
@ConditionalOnWebApplication(type = Type.SERVLET)
  1. включенныйServerPropertiesпривязки конфигурации.
@EnableConfigurationProperties(ServerProperties.class)
  1. Импортируются несколько классов.
@Import({ ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,
		ServletWebServerFactoryConfiguration.EmbeddedTomcat.class,
		ServletWebServerFactoryConfiguration.EmbeddedJetty.class,
		ServletWebServerFactoryConfiguration.EmbeddedUndertow.class })

В то же время введите конфигурацию в bean factory для других мест для вызова.

@Bean
public ServletWebServerFactoryCustomizer servletWebServerFactoryCustomizer(ServerProperties serverProperties) {
	return new ServletWebServerFactoryCustomizer(serverProperties);
}

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

spring.factories

Если вы не знаете, вы можете сначала прочитать эту статью.Серия Springboot (3) Автоматическая конфигурация Spring Boot.
Это действительно так, может бытьspring.factoriesНайдите указанные выше классы в . этоServletWebServerFactoryAutoConfiguration.

Согласно вышеприведенному анализу, можно обнаружить, чтоSpringbootофициальныйstarterнемногомодель.

  1. использоватьXXXPropertiesавтоматическая привязкаXXXИнформация о конфигурации в начале, например:ServerProperties.
  2. ПучокXXXPropertiesОпределяется в классе, который будет использоваться, например:ServletWebServerFactoryCustomizer.
  3. Напишите одинXXXAutoConfiguration, наXXXPropertiesавтоматическую настройку, ограничить эффективную сцену и создать необходимые классы дляBeanфабрика. как:ServletWebServerFactoryAutoConfiguration.

3. Сторонний режим интеграции

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

выбрать здесьmybatis-spring-boot-starterУчитесь анализу.

3.1 Знакомство с зависимостями

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.2</version>
</dependency>

здесьmybatisобрамленныйstarterзависеть от определенныхправило,Сейчасxxx-spring-boot-starter.

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

mybatis-spring-boot-starter

Проверятьmybatis-spring-boot-starterЗависимостей много, среди которых основная связана с автоматической настройкой.

<dependency>
	<groupId>org.mybatis.spring.boot</groupId>
	<artifactId>mybatis-spring-boot-autoconfigure</artifactId>
</dependency>

3.2 Автоматическая конфигурация

Проверятьmybatis-spring-boot-autoconfigureобнаружение контента иspringbootОфициальныйautoconfigureКонструктивно они аналогичны.

mybatis-spring-boot-autoconfigure

mybatisАвтоконфигурация также выполняется черезspring.factoriesчтобы указать автоматическую настройку, затем передайтеXxxAutoConfigurationсвязыватьXxxPropertiesдля автоматической настройки.

MybatisAutoConfiguration

В принципе и вышеspringbootОфициальныйstarterодинаковы, поэтому я не буду вводить слишком много.

4. Напишите свой собственный стартер

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

  1. Создать имя какxxx-spring-boot-starterпроект запуска.
  2. Создать имя какxxx-spring-boot-autoconfigureS проект.
    • Напишите класс привязки свойстваxxxProperties.
    • Написать класс обслуживания, импортироватьxxxProperties.
    • Напишите класс автоконфигурацииXXXAutoConfigurationВнедрить конфигурацию.
    • Создайтеspring.factoriesфайл, в котором указаны классы для автоматической настройки.
  3. Стартовый проект — это пустой проект для импортаxxx-spring-boot-autoconfigureи другие зависимости.
  4. Введение проектаstarter, настройте информацию, которую необходимо настроить.

4.1 Создать проект запуска

Поскольку стартер не требует реализации кода и должен зависеть только от других проектов, пустой проект maven создается напрямую. Но имя должно быть стандартизировано.
создано здесьstarterдаmyapp-spring-boot-starter.

myapp-spring-boot-starter

Файл pom очень прост, просто импортируйте следующийmyapp-spring-boot-autoconfigure.

<?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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>net.codingme.starter</groupId>
    <artifactId>myapp-spring-boot-starter</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!-- 启动器 -->
    <dependencies>
        <!--  引入自动配置项目 -->
        <dependency>
            <groupId>net.codingme.starter</groupId>
            <artifactId>myapp-spring-boot-autoconfigure</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
    </dependencies>
</project>

4.2 Создание проекта автоконфигурации

комбинированное лицоstarterАнализ, непосредственно создайте имя какmyapp-spring-boot-autoconfigureс проект. Только импортированные в проектspringbootродительский проект иspring-boot-starter.

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>net.codingme.starter</groupId>
    <artifactId>myapp-spring-boot-autoconfigure</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>myapp-spring-boot-autoconfigure</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>

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

Общая структура проекта показана на рисунке.

myapp-spring-boot-starter-autoconfigure

существуетHelloPropertiesчерез аннотацию@ConfigurationProperties(prefix = "myapp.hello")Пусть свойства в классе такие же, какmyapp.helloКонфигурация в начале привязана.

/**
 * <p>
 *
 * @Author niujinpeng
 * @Date 2019/10/29 23:51
 */
@ConfigurationProperties(prefix = "myapp.hello")
public class HelloProperties {

    private String suffix;

    public String getSuffix() {
        return suffix;
    }

    public void setSuffix(String suffix) {
        this.suffix = suffix;
    }
}

затем вHelloServiceсерединаsayHelloиспользование методаHelloPropertiesАвтоматически привязанное значение в .

public class HelloService {
    HelloProperties helloProperties;
    
    public String sayHello(String name) {
        return "Hello " + name + "," + helloProperties.getSuffix();
    }
    
    public HelloProperties getHelloProperties() {
        return helloProperties;
    }

    public void setHelloProperties(HelloProperties helloProperties) {
        this.helloProperties = helloProperties;
    }
}

чтобыHelloServiceМожет вводиться автоматически и может использоваться в обычном режимеHelloProperties, по этому мы
HelloServiceAutoConfigurationдескриптор классаHelloProperties.classВведенный, затемHelloServiceвводить вBean.

/**
 * web应用才生效
 */
@ConditionalOnWebApplication
/**
 * 让属性文件生效
 */
@EnableConfigurationProperties(HelloProperties.class)
/***
 * 声明是一个配置类
 */
@Configuration
public class HelloServiceAutoConfiguration {

    @Autowired
    private HelloProperties helloProperties;

    @Bean
    public HelloService helloService() {
        HelloService helloService = new HelloService();
        helloService.setHelloProperties(helloProperties);
        return helloService;
    }
}

Наконец вspring.factoriesВам нужно только указать класс для автоматической настройки.

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
net.codingme.starter.HelloServiceAutoConfiguration

На этом проект автоматической настройки завершен. допустимыйmyapp-spring-boot-autoconfigureРеализация проектаmvn installУпакуйте проект автоконфигурации в локальный репозиторий, затем используйте ту же команду дляmyapp-spring-boot-starterУстановка на склад. Потому что последний зависит от первого проекта, так что здесь первый требует продвинутогоmvn install.

4.3 Использование пользовательского лаунчера

Создаватьspringbootпроектmyapp-spring-boot-starter-test.

myapp-spring-boot-starter-test

вводитьwebЗависимость от введения я написалmyapp-spring-boot-starter.

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

<!-- 引入自己的 starter -->
<dependency>
    <groupId>net.codingme.starter</groupId>
    <artifactId>myapp-spring-boot-starter</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

написатьHelloControllerВнедрить в автоконфигурациюHelloServiceдля тестирования.

@RestController
public class HelloController {

    @Autowired
    HelloService helloService;

    @GetMapping("/hello")
    public String sayHello(String name) {
        return helloService.sayHello(name);
    }
}

так какautoConfigureопределено в проектеsayHelloМетод выведет «Привет» + входящее имя + настроеноhello.suffix, по этому мыspringbootНастройте это свойство в файле конфигурации.

myapp.hello.suffix=早上好

Запустите тестовый проект, перейдите по пути /hello и введите имя, чтобы увидеть, сработает ли автоматическая настройка.

访问测试

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

проект отправлен наGithub.
GitHub.com/Демон-бык/Судный день…

Спринбот серии Артикул

Springboot Series (1) Начало работы с Spring Boot
Серия Springboot (2) Конфигурационный файл Spring Boot
Серия Springboot (3) Автоматическая конфигурация Spring Boot
Springboot Series (4) Spring Boot Logging Framework
Серия Springboot (5) Статические ресурсы и механизм шаблонов для веб-разработки Spring Boot
Серия Springboot (6) Перехватчики и три основных компонента веб-разработки Spring Boot
Springboot Series (7) Анализ механизма обработки ошибок исключений для веб-разработки
Springboot Series (8) Ручная реализация шаблонов динамического баннера и преобразования изображения в символ
Серия Springboot (9) Мониторинг источников данных с использованием Spring JDBC и Druid
Серия Springboot (10) Доступ к базе данных с использованием данных Spring jpa
Серия Springboot (11) Использование Mybatis для доступа к базе данных
Серия Springboot (12) Используйте Mybatis для интеграции плагина пейджинга pagehelper и плагина mapper.
Серия Springboot (тринадцать) с использованием почтового сервиса
Серия Springboot (14) позволяет быстро включить HTTPS для шифрования вашего веб-сайта.
Серия Springboot (15) Как написать свой собственный стартер Springboot

Hello world :)

Я Аланг, яркая луна и чистый ветер, человек с техническими инструментами, который каждый день передвигает кирпичи.
Персональный сайт:www.wdbyte.com
Если вы хотите подписаться, вы можете подписатьсяпублика "Программист Аранг",илиБлог программиста Аранга,илиДобавьте меня в WeChat (wn8398).

Эта статья также была организована вGitHub.com/Ниу Мух/Java…, добро пожаловать Звезда.