自己实现一个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;
}
}