«1. Обзор

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

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

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

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

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 будут найдены в пути к классам, запустится MongoAutoConfiguration и будут инициализированы все bean-компоненты, связанные с mongo.

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

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

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

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

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

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

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

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

    private String host;

    // other fields with standard getters and setters
}

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

spring.data.mongodb.host = localhost

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

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

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

  1. An auto-configure class for our library along with a properties class for custom configuration.
  2. A starter pom to bring in the dependencies of the library and the autoconfigure project.

Мы назовем наш модуль автоконфигурации welcomer-spring-boot-autoconfigure. Этот модуль будет иметь два основных класса: GreeterProperties, который позволит задавать пользовательские свойства через файл application.properties, и GreeterAutoConfiguartion, который создаст bean-компоненты для библиотеки приветствия.

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

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

@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);
    }
}

«При запуске приложения будет запущен класс GreeterAutoConfiguration, если класс Greeter присутствует в пути к классам. В случае успешного запуска он заполнит контекст приложения Spring компонентами GreeterConfig и Greeter, прочитав свойства через класс GreeterProperties.

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

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

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

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

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

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

<project ...>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.baeldung</groupId>
    <artifactId>greeter-spring-boot-starter</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <greeter.version>0.0.1-SNAPSHOT</greeter.version>
        <spring-boot.version>2.2.6.RELEASE</spring-boot.version>
    </properties>

    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <version>${spring-boot.version}</version>
        </dependency>

        <dependency>
            <groupId>com.baeldung</groupId>
            <artifactId>greeter-spring-boot-autoconfigure</artifactId>
            <version>${project.version}</version>
        </dependency>

        <dependency>
            <groupId>com.baeldung</groupId>
            <artifactId>greeter</artifactId>
            <version>${greeter.version}</version>
        </dependency>

    </dependencies>

</project>

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

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

<dependency>
    <groupId>com.baeldung</groupId>
    <artifactId>greeter-spring-boot-starter</artifactId>
    <version>${greeter-starter.version}</version>
</dependency>

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

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

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

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

@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);
    }
}

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

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

«