自己实现一个springboot-redis-starter

1.springboot的优势

  • 创建spring项目简单
  • web项目自带tomcat
  • starter简化构建依赖配置
  • 自动配置(就是设置了默认值)
  • 零xml配置

2.starter的作用

  • 引入jar包
  • 完成bean的配置(通过配置文件完成自动装配)

使各个中间件,组件,数据库连接直接基于配置文件解耦。如在springboot中
引用druid-spring-boot-starter starter包,在完成配置就可以直接使用DataSource。
引入spring-boot-starter-data-redis starter包,在完成redis的配置便可以直接使用redisClient操作redis。

3.几个重要的注解

  • @ConfigurationProperties : 使该类可以读取配置文件中的属性。
  • @EnableConfigurationProperties注解的作用是:使使用 @ConfigurationProperties 注解的类生效。

  • @Conditional: 标注该bean是否会加入容器中。
  • @ConditionalOnBean:当容器中有指定的Bean的条件下
  • @ConditionalOnClass:当类路径下有指定的类的条件下
  • @ConditionalOnExpression:基于SpEL表达式作为判断条件
  • @ConditionalOnJava:基于JVM版本作为判断条件
  • @ConditionalOnJndi:在JNDI存在的条件下查找指定的位置
  • @ConditionalOnMissingBean:当容器中没有指定Bean的情况下
  • @ConditionalOnMissingClass:当类路径下没有指定的类的条件下
  • @ConditionalOnNotWebApplication:当前项目不是Web项目的条件下
  • @ConditionalOnProperty:指定的属性是否有指定的值
  • @ConditionalOnResource:类路径下是否有指定的资源
  • @ConditionalOnSingleCandidate:当指定的Bean在容器中只有一个,或者在有多个Bean的情况下,用来指定首选的Bean
  • @ConditionalOnWebApplication:当前项目是Web项目的条件下

4.自己实现一个自动装配的redis-starter

  • 新建一个maven starter项目
<groupId>com.chenxin</groupId>
    <artifactId>spring-cx-redis-starter</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <version>2.0.1.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>3.0.1</version>
        </dependency>
    </dependencies>
  • 新建一个properties配置类
//配置文件中的前缀
@ConfigurationProperties(prefix = "cx.redis")
public class RedisProperties {

    private String host = "localhost";

    private String password;

    private Integer port = 6379;
    //get/set方法省略
}
  • 新建一个redis客户端类,用于引用客户端调用
public class RedisClient{
    @Autowired
    private Jedis jedis;

    public String get(String key){
        String s = jedis.get(key);
        return s;
    }

    public String set(String key,String value){
        String setv = jedis.set(key, value);
        return value;
    }
}
  • 新建一个自动装配类(重点)
@Configuration
    //使该配置文件生效
    @EnableConfigurationProperties(RedisProperties.class)
    //必须出现该配置cx.redis.host才会加载该类
    @ConditionalOnProperty(prefix = "cx.redis",name = "host")
    public class RedisAutoConfiguration {
    @Autowired
    private RedisProperties redisProperties;
    
    //容器中不存在jedis类才会加载该类
    @Bean
    @ConditionalOnMissingBean(Jedis.class)
    public Jedis jedis(){
        Jedis jedis = new Jedis(redisProperties.getHost(),redisProperties.getPort());
        if(redisProperties.getPassword()!=null){
            jedis.auth(redisProperties.getPassword());
        }
        return jedis;
    }
    @Bean
    @ConditionalOnMissingBean(RedisClient.class)
    public RedisClient redisClient(){
        return new RedisClient();
    }
}
  • 新建一个spring.factories(找到自动装配类)

直接在该路径下创建该文件resources/META-INF/spring.factories

EnableAutoConfiguration指向新建的自动装配类,springboot就会加载该类,并且完成类的创建

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.cx.autoconfigure.RedisAutoConfiguration
  • starter打包

mvn install 在本地打个jar包

  • springboot项目调用
  • 创建springboot maven项目(引入该starter)
<parent>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-parent</artifactId>
          <version>2.1.6.RELEASE</version>
          <relativePath/> <!-- lookup parent from repository -->
      </parent>
      <groupId>com.cx</groupId>
      <artifactId>demo</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <name>demo</name>
  
      <properties>
          <java.version>1.8</java.version>
      </properties>
  
      <dependencies>
          <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-web</artifactId>
          </dependency>
  
          <dependency>
              <groupId>com.chenxin</groupId>
              <artifactId>spring-cx-redis-starter</artifactId>
              <version>1.0-SNAPSHOT</version>
          </dependency>
      </dependencies>
  • 完成配置
cx.redis.host=xxx.xx.2.248
cx.redis.port=6379
  • controller类测试
@SpringBootApplication
@RestController
public class DemoApplication {
public static void main(String[] args) {
    SpringApplication.run(DemoApplication.class, args);
}
@Autowired
private RedisClient redisClient;

@GetMapping("set")
public String set(String key,String value){
    redisClient.set(key,value);
    return value;
}

@GetMapping("get")
public String get(String key){
    String value = redisClient.get(key);
    return value;
}
}