Пользовательский стартер SpringBoot и автоматическая настройка

Java

Ядром SpringBoot является автоматическая настройка, а поддержка автоматической настройки — стартовый проект. В дополнение к официальному стартеру пользователи также могут настраивать собственные стартовые проекты в соответствии с правилами.

Пользовательские стартовые условия

Автоматическая настройка должна соответствовать следующим условиям:

  • Проверьте соответствующий класс в пути к классам в соответствии с условием, то есть вам необходимо предоставить соответствующий проверяемый класс;
  • Когда условия соблюдены, определенный Бин может быть сгенерирован и зарегистрирован в контейнере;
  • Возможность автоматической настройки конфигурации, требуемой проектом;

Пользовательский пружинный загрузочный стартер

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

Создать мавен проект

Создайте простой проект maven, конкретные шаги опущены. Его можно создать через IDE, например intellj idea, или через команду maven.

Структура каталогов следующая:

.
├── pom.xml
├── spring-boot-starter-msg.iml
└── src
    ├── main
    └── test

Внесите зависимость автоматической настройки SpringBoot spring-boot-autoconfigure в pom.xml:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-autoconfigure</artifactId>
    <version>2.1.5.RELEASE</version>
</dependency>

Определите класс обслуживания службы

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

Определите здесь класс MsgService.

package com.secbro2.msg;

import com.secbro2.utils.HttpClientUtils;

public class MsgService {

    /**
     * 访问发送短信的url地址
     */
    private String url;

    /**
     * 短信服务商提供的请求keyId
     */
    private String accessKeyId;

    /**
     * 短信服务商提供的KeySecret
     */
    private String accessKeySecret;

    public MsgService(String url, String accessKeyId, String accessKeySecret) {
        this.url = url;
        this.accessKeyId = accessKeyId;
        this.accessKeySecret = accessKeySecret;
    }

    public int sendMsg(String msg) {
        // 调用http服务并发送消息,返回结果
        return HttpClientUtils.sendMsg(url, accessKeyId, accessKeySecret, msg);
    }

    // 省略getter/setter方法
}

Среди них MsgService использует класс инструментов HttpClientUtils. В HttpClientUtils просто печатается только информация о параметрах запроса.

package com.secbro2.utils;

public class HttpClientUtils {

    public static int sendMsg(String url, String accessKeyId, String accessKeySecret, String msg) {
        //TODO 调用指定url进行请求的业务逻辑
        System.out.println("Http请求,url=" + url + ";accessKeyId=" + accessKeyId + ";accessKeySecret=" + accessKeySecret + ";msg=" + msg);
        return 0;
    }
}

определить класс конфигурации

Определите класс конфигурации MsgProperties, чтобы инкапсулировать базовую конфигурацию в application.properties или application.yml. Здесь префикс конфигурации для отправки SMS всегда msg.

@ConfigurationProperties(prefix = "msg")
public class MsgProperties {

    /**
     * 访问发送短信的url地址
     */
    private String url;

    /**
     * 短信服务商提供的请求keyId
     */
    private String accessKeyId;

    /**
     * 短信服务商提供的KeySecret
     */
    private String accessKeySecret;
    
    // 其他参数定义
    // 省略getter/setter方法

}

Соответствующие свойства собираются через аннотацию @ConfigurationProperties.

Создайте класс конфигурации автоматизации

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

@Configuration
@ConditionalOnClass(MsgService.class)
@EnableConfigurationProperties(MsgProperties.class)
public class MsgAutoConfiguration {

    /**
     * 注入属性配置类
     */
    @Resource
    private MsgProperties msgProperties;

    @Bean
    @ConditionalOnMissingBean(MsgService.class)
    @ConditionalOnProperty(prefix = "msg", value = "enabled", havingValue = "true")
    public MsgService msgService() {
        MsgService msgService = new MsgService(msgProperties.getUrl(), msgProperties.getAccessKeyId(),
                msgProperties.getAccessKeySecret());
        // 如果提供了其他set方法,在此也可以调用对应方法对其进行相应的设置或初始化。
        return msgService;
    }
}

Аннотация к классу MsgAutoConfiguration, @Configuration, используется для объявления класса как класса конфигурации; аннотация @ConditionalOnClass указывает, что соответствующее создание экземпляра будет выполняться только тогда, когда класс MsgService существует в пути к классам; @EnableConfigurationProperties настраивает соответствующие свойства в приложении. .properties Задается в объекте MsgProperties;

Аннотация к методу msgService, @Bean указывает, что объект, созданный этим методом, будет загружен в контейнер; @ConditionalOnMissingBean указывает, что объект MsgService будет создан, когда в контейнере нет объекта; @ConditionalOnProperty указывает, что msg. enable= в конфигурационном файле. При значении true выполняется соответствующее создание экземпляра.

добавить spring.factories

Когда весь базовый код и классы автоконфигурации готовы, их необходимо зарегистрировать. То есть знакомый нам конфигурационный файл META-INF/spring.factories. Конечно, это нужно создать в своем собственном проекте.

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.secbro2.msg.MsgAutoConfiguration

Зарегистрируйте класс MsgAutoConfiguration в файле конфигурации spring.factories. Если классов автоконфигурации несколько, разделите строки запятыми.

На этом запуск автоматического конфигурирования на основе Spring Boot завершен. Используйте «maven: install», чтобы упаковать его в локальный репозиторий maven или загрузить на частный сервер. Другие проекты можно использовать через зависимости maven.

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

В других проектах импортируйте эту зависимость через следующие зависимости.

<dependency>
    <groupId>com.secbro2</groupId>
    <artifactId>spring-boot-starter-msg</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

Затем настройте соответствующие параметры в application.properties текущего проекта:

msg.enabled=true
msg.url=127.0.0.1
msg.accessKeyId=10001
msg.accessKeySecret=afelwjfwfwef

Например, другие проекты также являются проектами Spring Boot, вы можете определить простой контроллер для тестирования.

@RestController
public class HelloWorldController {

    @Resource
    private MsgService msgService;

    @RequestMapping("/sendMsg")
    public String sendMsg(){
        msgService.sendMsg("测试消息");
        return "";
    }
}

При доступе через браузер: http://localhost:8080/sendMsg будет напечатан следующий журнал:

Http请求,url=127.0.0.1;accessKeyId=10001;accessKeySecret=afelwjfwfwef;msg=测试消息

Указывает, что объект MsgService настроен автоматически и тест пройден.

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

Подытожим рабочий процесс Starter:

  • Spring Boot сканирует пакеты JAR, от которых зависит проект, при запуске в поисках пакетов JAR, содержащих файл spring.factories;
  • Загрузите класс AutoConfiguration в соответствии с конфигурацией spring.factories;
  • По условиям аннотации @Conditional выполняется автоконфигурация и бин внедряется в контейнер Spring.


Программа Новые Горизонты: Захватывающие и растущие нельзя пропустить

程序新视界-微信公众号