天天看点

Spring Boot 进阶-SpringBoot手写一个Starter

作者:架构师面试宝典
Spring Boot 进阶-SpringBoot手写一个Starter

对于自动装配原理进行分析之后,我们可以基于这样一个机制来实现一个自己的Starter组件,这样会更加深入的了解Spring Boot的Starter的存在以及如何更好的使用这些Starter。

对于Spring Boot提供的很多的组件并不是包括了所有的技术组件,在实际开发中还是有很多的组件需要自己去进行Spring Boot Starter的封装操作。而这些Starter不外乎就是实现了如下的三个功能

  1. 引入相关场景依赖的Jar包进行管理
  2. 自动对该场景下使用的JavaBean进行注入和配置
  3. 声明或者加载配置文件中的配置并且提供自定义配置的入口

下面我们就通过一个简单的例子来完成对于如何封装一个Starter的理解。

Starter如何进行命名

首先需要说明的是,这里对于Starter的命名规则并没有明确的要求必须怎么样去命名,这里推荐的只是一种大众化的命名方式,也就是一种约定的命名方式。这里我们推荐模仿官方的命名方式,例如

  • web场景下的启动器:spring-boot-starter-web
  • jdbc场景下的启动器:spring-boot-starter-jdbc

当然还有很多的启动器命名是由第三方提供的,所以他们的命名方式也有自己的特点例如

  • MyBatis场景启动器:mybatis-spring-boot-starter
  • Druid场景启动器:druid-spring-boot-starter

实现一个缓存相关的场景启动器

我们都知道在SpringBoot中提供了一个Redis相关的场景启动器spring-boot-starter-data-redis ,并且通过RedisTemplate来实现对于Redis的装配操作。但是现在又出现了一种Redisson的客户端并且提供了比RedisTemplate更加高效的客户端支持所以这里我们通过实现Redisson的启动起来学习如何开发一个场景启动器。

首先我们需要来创建一个redisson-spring-boot-starter的Maven项目。并且在对应的POM文件中引入如下的依赖。

<dependency>
  <groupId>org.redisson</groupId>
  <artifactId>redisson</artifactId>
	<version>${redisson.version}</version>
</dependency>           

在之前的例子中,我们学习了关于配置类的编写方式,这里我们来编写对应的配置类,以及设置配置类属性。

@ConfigurationProperties(prefix = "nh.redisson")
@Data
public class RedissonProperties {
    private String host = "localhost";
    private Integer port = 6379;
    private String password;
    private Integer timeout;
    private boolean ssl;
}
           

当然在这个配置类中我们还可以指定更多的配置,这里我们先通过几个小的属性来进行一个简单的说明。

定义完配置类之后,我们就需要配置自动配置类了。根据之前我们学习过的规则,来创建一个RedissonAutoConfiguration的自动配置类,并且将相关的配置项以及配置文件进行绑定。

@Configuration
@ConditionalOnClass(Redisson.class)
@EnableConfigurationProperties(RedissonProperties.class)
public class RedissonAutoConfiguration {
    
    @Bean
    public RedissonClient redisClient(RedissonProperties redissonProperties){
        Config config = new Config();
        String  prefix = "redis://";
        if (redissonProperties.isSsl()){
            prefix = "redis://";
        }
        SingleServerConfig singleServerConfig = config.useSingleServer()
                .setAddress(prefix+redissonProperties.getHost()+":"+redissonProperties.getPort())
                .setConnectTimeout(redissonProperties.getTimeout());
        if (!StringUtils.isEmpty(redissonProperties.getPassword())){
            singleServerConfig.setPassword(redissonProperties.getPassword());
        }
        return Redisson.create(config);
    }
}           

最后一步也是最重要的一步,我们知道在Spring Boot 启动的时候加载自动配置文件的时候,都是通过在META-INF/spring.factories文件进行加载的,那么既然是自定义的Starter我们也需要在resource下创建META-INF/spring.factories文件,并且仿照它的样子来编写我们自己的注入内容,如下图所示。

Spring Boot 进阶-SpringBoot手写一个Starter

最终我们使用deploy工具将我们自定义的Starter打包到本地仓库中。通过如下的方式就可以引入到其他项目中并使用

<dependency>
    <groupId>com.example</groupId>
    <artifactId>redisson-spring-boot-starter</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>           

接下来就是在application.yml配置文件中添加如下的配置

nh:
  host: localhost
  port: 6379           

总结

到这里,我们的一个基于Redisson的缓存场景启动器就已经开发完成了。虽然实现的功能较为简单,但是其中却包含着如何理解Spring Boot启动原理相关的很多知识点,如果感兴趣的读者可以关注博主,阅读之前合集中的文章来掌握相关的知识,以便于大家能更好的理解Starter相关的内容。

继续阅读