[springboot] рукописный компонент spring-boot-starter
предисловие
Стартер будет включать в себя все используемые пакеты зависимостей, чтобы избежать проблем, вызванных тем, что разработчики сами вводят зависимости.
Хотя разные стартеры имеют разные реализации, в основном они используют две одинаковые вещи:ConfigurationProperties
иAutoConfiguration
.
Starter — это набор дескрипторов зависимостей, которые вы можете легко добавить в свое приложение. Или это можно понять таким образом, во многих случаях, когда мы разрабатываем, будет модуль, который зависит от другого модуля.В это время мы обычно используем зависимости модуля maven для зависимостей модуля, но в этом случае мы можем использовать Starter , Таким образом, модули, от которых необходимо зависеть, разрабатываются по пути Стартера, и, наконец, Стартер может быть непосредственно введен для достижения этого эффекта.
соглашение об именовании
Поскольку SpringBoot официально предоставляет множество Starters, чтобы различать, какие из них являются официальными, а какие сторонними, SpringBoot официально предлагает:
Стартеры, предоставленные третьими лицами, используют xxx-spring-boot-starter единообразно.
Официальный Starter использует spring-boot-starter-xxx.
нужно
Ниже мы возьмем Redisson в качестве примера для реализации упрощенной версии стартового компонента.RedissonClient
Требуемые банки и бобы зависят от нашего текущего проекта.
Структура проекта
Создать стартер
Сначала мы создаемredisson-spring-boot-starter
элементы и добавитьredisson
зависимый и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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.autu.example.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
<name>redisson-spring-boot-starter</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.3.1.RELEASE</version>
<!-- 禁止传递依赖 -->
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.13.1</version>
</dependency>
<!-- 配置文件提示,需加此依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<version>2.3.1.RELEASE</version>
</dependency>
</dependencies>
</project>
Напишите класс конфигурации
Создайте ConfigurationProperties для сохранения информации о конфигурации.
@ConfigurationProperties(prefix = "auto.redisson")
public class RedissonProperties {
/** Redis server host */
private String host = "localhost";
/** Redis server port */
private int port = 6379;
/** 连接超时时间 */
private int timeout;
/** 是否启用ssl支持 */
private boolean ssl;
...
}
Создайте класс конфигурации автоматизации
- Создавать
AutoConfiguration
, ссылаясь на определенную информацию о конфигурации - существует
AutoConfiguration
Реализуйте внедрение bean-компонентов и прочитайте информацию о конфигурации в - Добавьте этот класс в файл конфигурации spring.factories, чтобы объявить
@ConditionalOnClass(Redisson.class)
@EnableConfigurationProperties(RedissonProperties.class)
@Configuration
public class RedissonAutoConfiguration {
@Bean
RedissonClient redissonClient(RedissonProperties redissonProperties) {
Config config = new Config();
// 判断是否启用ssl
String prefix = redissonProperties.isSsl() ? "rediss://" : "redis://";
String host = redissonProperties.getHost();
int port = redissonProperties.getPort();
config.useSingleServer()
.setAddress(prefix + host + ":" + port)
.setConnectTimeout(1000 * 30);
return Redisson.create(config);
}
}
Создайтеspring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.autu.example.redisson.RedissonAutoConfiguration
Создайтеadditional-spring-configuration-metadata.json
additional-spring-configuration-metadata.json
Функция: описывать информацию о конфигурации и действовать как подсказка, когда другие проекты полагаются на текущий начальный компонент.
<!-- 配置文件提示需在starter中加入该依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<version>2.3.1.RELEASE</version>
</dependency>
{
"properties": [
{
"name": "autu.redissin.host",
"type": "java.lang.String",
"description": "redis服务器地址.",
"defaultValue": "localhost"
},{
"name": "autu.redisson.port",
"type": "java.lang.Integer",
"description": "redis服务器端口.",
"defaultValue": 6379
}
]
}
Далее мы запускаемmvn install
команда для развертывания проекта в пакете jar на локальном складе и предоставления его для другого вызова службы.
контрольная работа
Создайте тестовый проект, который зависит отredisson-spring-boot-starter
.
application.properties
конфигурационный файл
auto.redisson.host=127.0.0.1
auto.redisson.port=6379
auto.redisson.timeout=10000
auto.redisson.ssl=false
тестовый класс
@RestController
public class HelloController {
@Autowired
RedissonClient redissonClient;
@GetMapping("/test")
public String say() {
RBucket<Object> bucket = redissonClient.getBucket("name");
if (bucket.get() == null) {
bucket.set("bucket");
}
return bucket.get().toString();
}
}
Результаты теста
Из результатов мы видим, что стартер определяетRedissonClient
Он был успешно внедрен в тестовый проект.