springboot-手写starter

以写redissonstarter为例,去操作redis客户端的数据。

第一步:创建一个maven项目,artifactId命名为redisson-spring-boot-starter。

1).starter命名规范:redisson是我们自定义的,后面-spring-boot-starter是固定命名。

第二步:引入这些依赖:redisson 、spring-boot-starter、spring-boot-configuration-processor

1).<optional>true</optional>这个标签的作用:当别人通过pom依赖这个项目的时候,这个不会被传递依赖进来,当你依赖某各工程很庞大或很可能与其他工程的jar包冲突的时候建议加上optional标签设置为true,可以节省开销,同时减少依赖冲突。

2).spring-boot-configuration-processor依赖的作用:spring默认使用yml中的配置,但有时候要用传统的xml或properties配置,就需要使用spring-boot-configuration-processor了

    <dependencies>
        <dependency>
            <groupId>org.redisson</groupId>
            <artifactId>redisson</artifactId>
            <version>3.15.6</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <version>2.5.7</version>
            <optional>true</optional>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <version>2.1.7.RELEASE</version>
            <optional>true</optional>
        </dependency>
    </dependencies>

第三步:创建RedissonProperties 和RedissonAutoConfiguration类;增加META-INF文件夹,下面增加spring.factories

1).@ConfigurationProperties(prefix = "wcx.redisson")

@ConfigurationProperties注解默认读取主配置文件,springboot中主配置文件是application.properties和application.yml。

这样当我们starter创建好,被别人依赖的时候,别人就可以在application.yml配置相关属性被我们读取啦。

@ConfigurationProperties(prefix = "wcx.redisson")
public class RedissonProperties {
    private String post="localhost";
    private String port="6379";
    private int timeout=5000;
    private boolean ssl=false;

    public String getPost() {        return post;    }
    public void setPost(String post) {        this.post = post;    }
    public String getPort() {        return port;    }
    public void setPort(String port) {        this.port = port;    }
    public int getTimeout() {        return timeout;    }
    public void setTimeout(int timeout) {        this.timeout = timeout;    }
    public boolean isSsl() {        return ssl;    }
    public void setSsl(boolean ssl) {        this.ssl = ssl;    }
}

2).@EnableConfigurationProperties(RedissonProperties.class)

如果一个配置类只配置@ConfigurationProperties注解,而没有使用@Component,那么在IOC容器中是获取不到properties 配置文件转化的bean

@EnableConfigurationProperties 相当于把使用 @ConfigurationProperties 的类进行了一次注入。

如果@ConfigurationProperties是在第三方包中,那么@component是不能注入到容器的。只有@EnableConfigurationProperties才可以注入到容器。

@Configuration
@EnableConfigurationProperties(RedissonProperties.class)
public class RedissonAutoConfiguration {
    @Bean
    public RedissonClient getRedissonClient(RedissonProperties redissonProperties){
        Config config=new Config();
        String prefix="redis://";
        if(redissonProperties.isSsl()){
            prefix="rediss://";
        }
         config.useSingleServer()
                 .setAddress(prefix+redissonProperties.getPost()+":"+redissonProperties.getPort())
                 .setTimeout(redissonProperties.getTimeout());
        return Redisson.create(config);
    }

}

3).spring.factories里面配置我们的RedissonAutoConfiguration类

spring.factories作用:别人依赖我们的starter项目的时候,可以把spring.factories里配置将这些值导入容器。

ps:这里是不是很像springboot的自动装配原理,以及applicaion.yml和spring.factories联系是什么呢?
springboot自动装配xxAutoConfiguration,从xxProperties取默认值,想修改,就在applicaion.yml配置文件去配。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.wcx.config.RedissonAutoConfiguration

4).增加提示:配置文件配置的时候会有提示说明,这个配置项的解释,如下图。

META-INF文件夹下增加additional-spring-configuration-metadata.json文件

{
  "properties": [
    {
      "name": "wcx.redisson.port",
      "type": "java.lang.String",
      "sourceType": "com.wcx.config.RedissonProperties",
      "defaultValue": "6379",
      "description": "端口"
    },
    {
      "name": "wcx.redisson.post",
      "type": "java.lang.String",
      "sourceType": "com.wcx.config.RedissonProperties",
      "defaultValue": "localhost",
      "description": "ip"
    }
  ]
}

第四步:maven打包:install(把项目打包并尝试着运行一次,打包后的资源文件在项目的target 文件夹下面, 然后把打好的包安装到maven 本地仓库,可以提供给其它项目进行依赖

第五步:测试:

1).创建测试项目,直接创建springboot项目,引入spring-boot-starter-web依赖和我们的redisson-spring-boot-starter依赖。

ps:普通项目和web项目区别:wen项目可以一直启动,普通启动完就直接完了~~

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
         <groupId>org.wcx</groupId>
         <artifactId>redisson-spring-boot-starter</artifactId>
         <version>1.0-SNAPSHOT</version>
    </dependency>

2).写一个接口测试,返回key的数量。

@RestController
public class RedissonTestController {
    @Autowired
    private RedissonClient redissonClient;

    @RequestMapping("/hello")
    public String hello(){
        return ""+redissonClient.getKeys().count();
    }
}

3).启动Redis服务端和客户端,往里面set一些值。

4).请求我们的测试接口,返回key的数量。成功!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值