对于自动装配的原理进行分析之后,我们可以基于这个机制来实现一个 Starter组件,如果还有童鞋对自动装配不太了解的,可以回头看一下我的上一篇博文
https://blog.csdn.net/qq_38377525/article/details/122920370https://blog.csdn.net/qq_38377525/article/details/122920370Spring Boot官方提供的 Starter并不能囊括所有的技术组件,在平时的工作中,如果自己的项目需要支持 Spring Boot,也需要开发 Starter组件。从 Spring Boot官方提供的 Starter的作用来看, Starter组件主要有三个功能:涉及相关组件的Jar包依赖、自动实现Bean的装配、自动声明并且加载application.properties文件中的属性配置
1、Starter的命名规范
Starter的命名主要分为两类,一类是官方命名,另一类是自定义组件命名。这种命名格式并不是强制性的是一种约定俗成的方式,可以让开发者更容易识别。
官方命名的格式为:spring-boot- starter-模块名称,比如常见的spring- boot-starter-data-redis、spring- boot-starter-web。
自定义命名格式为:模块名称- spring-boot-starter,比如mybatis-spring-boot- starter
简单来说,官方命名中模块名放在最后,而自定义组件中模块名放在最前面
2、举例编写自定义Starter组件
例子:基于Redis的Starter
虽然 Spring Boot官方提供了 spring-boot-starter-data-redis组件来实现 RedisTemplate的自动装配,但是我们用这个案例来让大家更好的去领会,因为自动装配大家都清楚了,Redis大家想必也不陌生,综合来说方便理解
实现步骤:
1、创建一个工程:redis-spring-boot-starter
2、添加redis依赖,使用Redisson来封装Starter,依赖如下
<dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.11.1/version> </dependency>
3、定义属性类RedissonProperties,封装redis必需属性
@ConfigurationProperties(prefix ="starter.redisson") public class RedissonProperties{ private String host= "localhost"; private String password; private int port = 6379; private int timeout; private boolean ssl; 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;} public int getPort(){return port;} public void setport(int port){this.port=port;} public boolean isSsl(){return ssl;} public void setssl(boolean ssl){this.ssl=ssl;} public int getTimeout(){return timeout;} public void setTimeout(int timeout){this.timeout=timeout;}; }
4、定义需要自动装配的配置类RedissonAutoConfiguration
@Configuration @ConditionalOnClass(Redisson.class) @EnableConfigurationProperties(RedissonProperties.class) public class RedissonAutoConfiguration { @Bean RedissonClient redissonClient(RedissonProperties redissonProperties) { Config config = new Config(); String prefix = "redis://"; if(redissonProperties.isSsl()) { prefix = "rediss://"; } SingleServerConfig singleServerConfig = config.useSingleServer() .setAddress(prefix + redissonProperties.getHost() + ":" +redissonProperties.getPort()) .setConnectTimeout(redissonProperties.getTimeout()); if(!StringUtils.isEmpty(redissonProperties.getPassword())){ singleServerConfig.setPassword(redissonProperties.getPassword()); } return Redisson.create(config); } }
5、在META-INF创建spring.factories文件,让SpringBoot可以扫描到该文件,自行完成自动装配,对应的key/value如下:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\com.cb.redisspringbootstarter.config.RedissonAutoConfiguration
6、然后打jar包,在需要这个starter服务中,添加依赖,并且添加配置属性
<dependency> <groupId>com.cb</groupId> <artifactId>redis-spring-boot-starter</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency>
#根据RedissonProperties配置类的前缀来定义 starter.redisson.host=127.0.0.1 starter.redisson.port=6379
到这里,自定义Starter组件就完成了,其中还有一些操作,比如什么时候jar包用起来,可以使用@Conditional机制来做,这里就不做追叙了,如果后面有空,再补充
demo样例链接:
https://gitee.com/IT_CB/redis-spring-boot-starterhttps://gitee.com/IT_CB/redis-spring-boot-starter