Ядром 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.