手写一个简单的Starter

Starter的命令规范

Starter的命令规范有两种,一种是官方命令,另外一种是自定义命名。

  • 官方命名格式:spring-boot-starter-模块名称,比如:spring-boot-starter-web
  • 自定义命名格式:模块名称-spring-boot-starter, 比如:mybatis-spring-boot-starter

注解

在这里插入图片描述

  • @ConditionalOnClass(Redisson.class):表示Redisson.class存在时才会继续进行下面的配置;
  • @EnableConfigurationProperties(RedissonProperties.class):从IOC容器中获取application.properties配置文件的Bean;
  • @Configuration表名此类是个配置类;
  • @ConfigurationProperties注解主要用来把properties配置文件转化为bean来使用的,而@EnableConfigurationProperties注解的作用是@ConfigurationProperties注解生效。如果只配置@ConfigurationProperties注解,在IOC容器中是获取不到properties配置文件转化的bean的。
  • @Bean:把当前类加载到IOC容器里;
  • -@Value:从Properties里取到值;

项目结构

在这里插入图片描述

代码实现

1.创建一个Maven工程

2.加载核心依赖

<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>

3.定义属性类

package com.redisson;
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties(prefix = "redisson")
public class RedissonProperties {
    
    
    private String host="localhost";
    private int port = 6379;
    private String password;
    private int timeout; //超时时间
    private boolean ssl;

    public String getPassword() {
    
    
        return password;
    }

    public void setPassword(String password) {
    
    
        this.password = password;
    }

    public String getHost() {
    
    
        return host;
    }

    public void setHost(String host) {
    
    
        this.host = host;
    }

    public int getPort() {
    
    
        return port;
    }

    public void setPort(int 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;
    }
}

4.自动配置类

package com.redisson;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@ConditionalOnClass(Redisson.class)
@EnableConfigurationProperties(RedissonProperties.class)
@Configuration
public class RedissonAutoConfiguration {
    
    

    @Bean
    RedissonClient redissonClient(RedissonProperties redissonProperties){
    
    
       Config config = new Config();
       String prefix = "redis://";
       if(redissonProperties.isSsl()){
    
    
          prefix = "rediss://";
       }
       config.useSingleServer().setAddress(prefix+redissonProperties.getHost()+":"+redissonProperties.getPort()).setPassword(redissonProperties.getPassword()).setConnectTimeout(redissonProperties.getTimeout());
       return Redisson.create(config);
    }

}

5.创建spring.factories文件

在这里插入图片描述

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.redisson.RedissonAutoConfiguration

6.配置提示工具

additional-spring-configuration-metadata.json

{
  "properties":[
    {
      "name":"redisson.host",
      "type":"java.lang.String",
      "description":"redis的服务器地址",
      "defaultValue":"localhost"
    },{
      "name":"redisson.port",
      "type":"java.lang.Integer",
      "description":"redis的服务器端口",
      "defaultValue":6379
    },{
      "name":"redisson.password",
      "type":"java.lang.String",
      "description":"redis的服务器密码"
    }
  ]
}

7.打包 mvn install

在这里插入图片描述

8.创建一个Spring Boot项目测试

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

在这里插入图片描述

package com.springbootstarterdemo;

import org.redisson.api.RBucket;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.TimeUnit;

@SpringBootApplication
@RestController
public class SpringbootStarterDemoApplication {
    
    

    @Autowired
    private RedissonClient redissonClient;

    public static void main(String[] args) {
    
    
        SpringApplication.run(SpringbootStarterDemoApplication.class, args);
    }

    @GetMapping("/test/hello")
    public String test(){
    
    
        setString("test","aaa");
        getString("test");
        System.out.println("查询出来的值:"+getString("test"));
        return "666";
    }

    public String getString(String key) {
    
    
        RBucket<Object> result = this.redissonClient.getBucket(key);
        return result.get().toString();
    }

    public void setString(String key, Object value) {
    
    
        RBucket<Object> result = this.redissonClient.getBucket(key);
        if (!result.isExists()) {
    
    
            result.set(value, 5, TimeUnit.MINUTES);
        }
    }

}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/xiaowanzi_zj/article/details/121444319