自定义starter的命名规范
SpringBoot提供的starter以spring-boot-starter-xxx
的方式命名的。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> <version>1.2.2</version> </dependency>
官方建议自定义的starter使用xxx-spring-boot-starter
命名规则。以区分SpringBoot生态提供的starter。
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.2.2</version> </dependency>
项目结构及介绍
项目结构
项目介绍
1)此项目为定义一个redis整合SpringBoot的starter,为了方便区别用my前缀标记自定义的类。
2)myredis-spring-boot-autoconfigure:自定义myredis-starter的核心,核心都在这个module中
3)myredis-spring-boot-starter: 仅仅添加了myredis-spring-boot-autoconfigure的依赖 ,目的是隐藏 细节
4)springboot-demo : 引入自定义的starter依赖,进行测试
项目下载
url:
share/StarterDemo at master · cbeann/share · GitHub
注意:
先install 父工程,
在install 子工程 myredis-spring-boot-autoconfigure
在install 子工程 myredis-spring-boot-starter
在添加依赖在运行测试
项目构建
myredis-spring-boot-autoconfigure模块(Maven项目)
添加依赖
<!-- 引入spring-boot-starter,所有starter的基本配合 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <version>2.2.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> <version>2.2.2.RELEASE</version> </dependency> <!--自定义的yml提示--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <version>2.2.2.RELEASE</version> <optional>true</optional> </dependency> <!-- jedis --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.0.1</version> </dependency>
连接redis的参数配置类
package com.myredis; import org.springframework.boot.context.properties.ConfigurationProperties; /** * @author CBeann * @create 2020-05-30 14:51 */ @ConfigurationProperties(prefix = "myredis") public class MyRedisProperties { //ip private String host; //密码 private String password; public String getHost() { return host; } public void setHost(String host) { this.host = host; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
自定义myredisTemplate
package com.myredis; import redis.clients.jedis.Jedis; /** * @author CBeann * @create 2020-05-30 15:03 */ public class MyRedisTemplate { private Jedis jedis; public MyRedisTemplate(Jedis jedis) { this.jedis = jedis; } public String setString(String key ,String val){ String set = jedis.set(key, val); return set; } public Long delKey(String key){ Long del = jedis.del(key); return del; } public MyRedisTemplate() { } }
MyRedisAutoConfigulation自动配置类
package com.myredis; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import redis.clients.jedis.Jedis; /** * @author CBeann * @create 2020-05-30 14:59 */ @Configuration @EnableConfigurationProperties(MyRedisProperties.class) @ConditionalOnProperty(prefix = "myredis",name = "host", matchIfMissing =false)//如果application.yml或者properties中没有myredis.host属性,则此类MyRedisAutoConfigulation不注入IOC容器 public class MyRedisAutoConfigulation { @Bean public Jedis jedis(MyRedisProperties myRedisProperties) { //获取redis的参数 String host = myRedisProperties.getHost(); String password = myRedisProperties.getPassword(); // 连接redis服务 Jedis jedis = new Jedis(host, 6379); jedis.auth(password); return jedis; } @Bean public MyRedisTemplate myRedisTemplate(Jedis jedis) { return new MyRedisTemplate(jedis); } }
创建spring.factories
在resources下创建目录META-INF,在META-INF下创建spring.factories,即resources/META-INF/spring.factories
其中等号(=)左边为固定值,右边为自定义的自动配置类
# Auto Configure org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.myredis.MyRedisAutoConfigulation
安装到本地仓库
clean->install
myredis-spring-boot-starter(Maven项目)
添加上面模块的依赖
<dependency> <groupId>com.cbeann</groupId> <artifactId>myredis-spring-boot-autoconfigure</artifactId> <version>1.0-SNAPSHOT</version> </dependency>
安装到本地仓库
clean->install
springboot-demo模块(SpringBoot项目+web)
项目基础
SpringBoot+web
修改pom文件
<!--自定义starter--> <dependency> <groupId>com.cbeann</groupId> <artifactId>myredis-spring-boot-starter</artifactId> <version>1.0-SNAPSHOT</version> </dependency>
添加application.yml配置信息
myredis.host=39.105.30.146 myredis.password=123456
创建controller进行测试
package com.example.springbootdemo.controller; import com.myredis.MyRedisTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.time.LocalTime; /** * @author CBeann * @create 2020-05-30 15:25 */ @RestController public class HelloController { @Autowired private MyRedisTemplate myRedisTemplate; @RequestMapping("/hello") public String hello(){ myRedisTemplate.setString("key2", LocalTime.now().toString()); return LocalTime.now().toString(); } // @RequestMapping("/hello") // public String hello2(){ // return LocalTime.now().toString(); // } }
测试结果
http://localhost:8080/hello
redis中添加了key,value数据
总结
1)yml提示
在myredis-spring-boot-autoconfigure中添加依赖,并且类(MyRedisProperties )上有注解
<!--自定义yml提示--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <version>2.2.2.RELEASE</version> <optional>true</optional> </dependency>
2)如果没有上图中的属性,证明我不用redis,系统不应该报错
如果我没有配置myredis的属性,我也没用redis,正常的逻辑是不能报错。
报错的原因是你没有配置myredis的信息,但是他还是加载Jedis并且创建连接,那肯定是报错了,所以不让他加载MyRedisAutoConfigulation这个类,那么这个关于自定义Starter的类就全不让它加载,那么就和没有引入这个依赖一样
下面代码所示, 如果application.yml或者properties中没有myredis.host属性,则此类MyRedisAutoConfigulation不注入IOC容器
@ConditionalOnProperty(prefix = "myredis",name = "host", matchIfMissing =false)//如果application.yml或者properties中没有myredis.host属性,则此类MyRedisAutoConfigulation不注入IOC容器 public class MyRedisAutoConfigulation {