Spring Boot由众多Starter组成,随着版本的推移Starter家族成员也与日俱增。在传统Maven项目中通常将一些层、组件拆分为模块来管理, 以便相互依赖复用,在Spring Boot项目中我们则可以创建自定义Spring Boot Starter来达成该目的。
本篇将通过一个简单的例子来演示如何编写自己的starter
1、添加maven依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>redis-starter-test</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>redis-spring-boot-starter</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>2.3.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<version>2.3.1.RELEASE</version>
</dependency>
</dependencies>
</project>
2、属性类
package com.kongliand.config; import org.springframework.boot.context.properties.ConfigurationProperties; /** * @description: TODO * @class_name RedisProperties * @author: kevin * @created: 2020/8/31 11:24 上午 * @version: 1.0 */ @ConfigurationProperties(prefix = "kevin") public class RedisProperties { private String host; private String port; private String database; public String getHost() { return host; } public void setHost(String host) { this.host = host; } public String getPort() { return port; } public void setPort(String port) { this.port = port; } public String getDatabase() { return database; } public void setDatabase(String database) { this.database = database; } }
3、自动配置类
package com.kongliand.config; import com.kongliand.service.RedisService; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * @description: TODO * @class_name RedisAutoConfiguration * @author: kevin * @created: 2020/8/31 11:29 上午 * @version: 1.0 */ @Configuration @EnableConfigurationProperties(value = RedisProperties.class) public class RedisAutoConfiguration { private final RedisProperties redisProperties; public RedisAutoConfiguration(RedisProperties redisProperties) { this.redisProperties = redisProperties; } @Bean @ConditionalOnMissingBean(RedisService.class) public RedisService redisService(){ return new RedisService(redisProperties); } }
4、服务类Service
package com.kongliand.service; import com.kongliand.config.RedisProperties; /** * @description: TODO * @class_name RedisService * @author: kevin * @created: 2020/8/31 11:25 上午 * @version: 1.0 */ public class RedisService { private RedisProperties redisProperties; public RedisService(RedisProperties redisProperties) { this.redisProperties = redisProperties; } public String getRedisInfo(){ return redisProperties.getHost()+"->"+redisProperties.getPort()+"->"+redisProperties.getDatabase(); } }
5、添加spring.factories
在resources/META-INF/
下创建spring.factories
文件:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.kongliand.config.RedisAutoConfiguration
mvn:install
打包安装,一个Spring Boot Starter便开发完成了
6、测试
另外创建一个SpringBoot工程,在maven中引入这个starter依赖, 然后在单元测试中引入这个Service看看效果
<dependency> <groupId>org.example</groupId> <artifactId>redis-spring-boot-starter</artifactId> <version>1.0-SNAPSHOT</version> </dependency> 修改applicaton.properties kevin.host=127.0.0.1 kevin.database=0 kevin.port=6379 测试类
package com.kongliand.controller; import com.kongliand.service.RedisService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; /** * @description: TODO * @class_name RedisTest * @author: kevin * @created: 2020/8/31 11:44 上午 * @version: 1.0 */ @RestController public class RedisTest { @Autowired private RedisService redisService; @GetMapping("/test") public String getRedisInfo(){ return redisService.getRedisInfo(); } }