Научу писать компонент spring-boot-starter вручную

Spring Boot

[springboot] рукописный компонент spring-boot-starter

предисловие

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

Хотя разные стартеры имеют разные реализации, в основном они используют две одинаковые вещи:ConfigurationPropertiesиAutoConfiguration.

1593781249493

Starter — это набор дескрипторов зависимостей, которые вы можете легко добавить в свое приложение. Или это можно понять таким образом, во многих случаях, когда мы разрабатываем, будет модуль, который зависит от другого модуля.В это время мы обычно используем зависимости модуля maven для зависимостей модуля, но в этом случае мы можем использовать Starter , Таким образом, модули, от которых необходимо зависеть, разрабатываются по пути Стартера, и, наконец, Стартер может быть непосредственно введен для достижения этого эффекта.

соглашение об именовании

Поскольку SpringBoot официально предоставляет множество Starters, чтобы различать, какие из них являются официальными, а какие сторонними, SpringBoot официально предлагает:

Стартеры, предоставленные третьими лицами, используют xxx-spring-boot-starter единообразно.

Официальный Starter использует spring-boot-starter-xxx.

нужно

Ниже мы возьмем Redisson в качестве примера для реализации упрощенной версии стартового компонента.RedissonClientТребуемые банки и бобы зависят от нашего текущего проекта.

Структура проекта

1593784887682

Создать стартер

Сначала мы создаем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
    }
  ]
}

1593785391719

Далее мы запускаем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();
    }
}

Результаты теста

1593789302601

Из результатов мы видим, что стартер определяетRedissonClientОн был успешно внедрен в тестовый проект.

исходный адрес

Осень200.com/2020/07/03/…