Рубрики
Без рубрики

Создание пользовательского стартера с помощью Spring Boot

Краткое и практическое руководство по созданию пользовательских пружинных загрузочных стартеров.

Автор оригинала: baeldung.

1. Обзор

Разработчики core Spring Boot предоставляют стартеры для большинства популярных проектов с открытым исходным кодом, но мы не ограничиваемся ими.

Мы также можем написать ваши собственные стартеры . Если у нас есть внутренняя библиотека для использования в нашей организации, было бы хорошей практикой также написать для нее стартер, если она будет использоваться в контексте весенней загрузки.

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

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

2. Демистификация автоматической конфигурации Spring Boot

2.1. Классы автоматической настройки

При запуске Spring Boot он ищет файл с именем spring.factories в пути к классу. Этот файл находится в каталоге META-INF . Давайте посмотрим на фрагмент этого файла из проекта spring-boot-autoconfigure :

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\
org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,\
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration

Этот файл сопоставляет имя с различными классами конфигурации, которые попытается запустить Spring Boot. Итак, согласно этому фрагменту, Spring Boot попытается запустить все классы конфигурации для RabbitMQ, Cassandra, MongoDB и Hibernate.

Будут ли эти классы фактически выполняться, будет зависеть от наличия зависимых классов в пути к классам. Например, если классы для MongoDB находятся на пути к классам, mongautoconfiguration будет запущен, и все связанные с mongo компоненты будут инициализированы.

Эта условная инициализация включена аннотацией @ConditionalOnClass . Давайте посмотрим на фрагмент кода из mongautoconfiguration class, чтобы увидеть его использование:

@Configuration
@ConditionalOnClass(MongoClient.class)
@EnableConfigurationProperties(MongoProperties.class)
@ConditionalOnMissingBean(type = "org.springframework.data.mongodb.MongoDbFactory")
public class MongoAutoConfiguration {
    // configuration code
}

Теперь, как – если MongoClient доступен в пути к классу – этот класс конфигурации будет работать, заполняя фабрику Spring bean с MongoClient , инициализированной настройками конфигурации по умолчанию.

2.2. Пользовательские свойства из файла application.properties

Spring Boot инициализирует компоненты, используя некоторые предварительно настроенные значения по умолчанию. Чтобы переопределить эти значения по умолчанию, мы обычно объявляем их в файле application.properties с определенным именем. Эти свойства автоматически подхватываются загрузочным контейнером Spring.

Давайте посмотрим, как это работает.

В фрагменте кода для mongautoconfiguration , @EnableConfigurationProperties аннотация объявляется с классом MongoProperties , который действует как контейнер для пользовательских свойств:

@ConfigurationProperties(prefix = "spring.data.mongodb")
public class MongoProperties {

    private String host;

    // other fields with standard getters and setters
}

Префикс плюс имя поля составляют имена свойств в файле application.properties . Итак, чтобы установить host для MongoDB, нам нужно только написать следующее в файле свойств:

spring.data.mongodb.host = localhost

Аналогично, значения для других полей в классе можно задать с помощью файла свойств.

3. Создание пользовательского стартера

Основываясь на концепциях, приведенных в разделе 2, для создания пользовательского стартера нам необходимо написать следующие компоненты:

  1. Класс автоматической настройки для нашей библиотеки вместе с классом свойств для пользовательской конфигурации.
  2. Стартер pot для включения зависимостей библиотеки и проекта автоматической настройки.

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

3.1. Модуль Автоконфигурации

Мы назовем наш модуль автоматической настройки greeter-spring-boot-autoconfigure . Этот модуль будет иметь два основных класса, т. е. Большие свойства , которые позволят устанавливать пользовательские свойства через application.properties file и GreeterAutoConfiguartion , которые создадут компоненты для greeter library.

Давайте посмотрим на код для обоих классов:

@ConfigurationProperties(prefix = "baeldung.greeter")
public class GreeterProperties {

    private String userName;
    private String morningMessage;
    private String afternoonMessage;
    private String eveningMessage;
    private String nightMessage;

    // standard getters and setters

}
@Configuration
@ConditionalOnClass(Greeter.class)
@EnableConfigurationProperties(GreeterProperties.class)
public class GreeterAutoConfiguration {

    @Autowired
    private GreeterProperties greeterProperties;

    @Bean
    @ConditionalOnMissingBean
    public GreetingConfig greeterConfig() {

        String userName = greeterProperties.getUserName() == null
          ? System.getProperty("user.name") 
          : greeterProperties.getUserName();
        
        // ..

        GreetingConfig greetingConfig = new GreetingConfig();
        greetingConfig.put(USER_NAME, userName);
        // ...
        return greetingConfig;
    }

    @Bean
    @ConditionalOnMissingBean
    public Greeter greeter(GreetingConfig greetingConfig) {
        return new Greeter(greetingConfig);
    }
}

Нам также необходимо добавить файл spring.factories в каталог src/main/resources/META-INF со следующим содержимым:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.baeldung.greeter.autoconfigure.GreeterAutoConfiguration

При запуске приложения класс Greeter Auto Configuration будет запущен, если класс Greeter присутствует в пути к классу. При успешном запуске он заполнит контекст приложения Spring с помощью Greeter Config и Greeter beans, прочитав свойства через GreeterProperties class.

Аннотация @ConditionalOnMissingBean гарантирует, что эти компоненты будут созданы только в том случае, если они еще не существуют. Это позволяет разработчикам полностью переопределить автоматически настроенные компоненты, определив их собственные в одном из классов @Configuration .

3.2. Создание pom.xml

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

Согласно соглашению об именовании, все стартеры, которые не управляются основной командой загрузки Spring, должны начинаться с имени библиотеки, за которым следует суффикс -spring-boot-starter . Поэтому мы будем называть наш стартер как greater-spring-boot-starter:


    4.0.0

    com.baeldung
    greeter-spring-boot-starter
    0.0.1-SNAPSHOT

    
        UTF-8
        0.0.1-SNAPSHOT
        2.2.6.RELEASE
    

    

        
            org.springframework.boot
            spring-boot-starter
            ${spring-boot.version}
        

        
            com.baeldung
            greeter-spring-boot-autoconfigure
            ${project.version}
        

        
            com.baeldung
            greeter
            ${greeter.version}
        

    

3.3. Использование стартера

Давайте создадим greater-spring-boot-sample-app , который будет использовать стартер. В pom.xml нам нужно добавить его в качестве зависимости:


    com.baeldung
    greeter-spring-boot-starter
    ${greeter-starter.version}

Spring Boot автоматически настроит все, и у нас будет Больший боб, готовый к вводу и использованию.

Давайте также изменим некоторые значения по умолчанию для Больших свойств , определив их в файле application.properties с префиксом baeldung.greeter :

baeldung.greeter.userName=Baeldung
baeldung.greeter.afternoonMessage=Woha\ Afternoon

Наконец, давайте использовать Greater bean в нашем приложении:

@SpringBootApplication
public class GreeterSampleApplication implements CommandLineRunner {

    @Autowired
    private Greeter greeter;

    public static void main(String[] args) {
        SpringApplication.run(GreeterSampleApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        String message = greeter.greet();
        System.out.println(message);
    }
}

4. Заключение

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

Полный исходный код для всех модулей, которые мы создали в этой статье, можно найти на GitHub .