SpringBoot 自定义 Starter

Starter 命名规范

官方的 Starter 遵循 spring-boot-starter-* 的命名模式,如 spring-boot-starter-data-jpa 。第三方的 Starter 通常以自己的项目名称开始,例如,名为 thirdpartyproject 的第三方入门项目通常被命名为 thirdpartyproject-spring-boot-starter

自定义 Starter

创建 Starter 工程

使用 maven-archetype-quickstart 架手架创建一个 Maven 工程,artifactId 设置为 zombie-spring-boot-starter

pom.xml 文件中引入依赖的 jar 包:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>2.1.7.RELEASE</version>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<version>2.1.7.RELEASE</version>
</dependency>

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
</dependency>
</dependencies>

设置以 jar 包的方式打包:

1
<packaging>jar</packaging>

定义服务类

定义一个服务类 ZombieService :

1
2
3
4
5
6
7
8
9
public class ZombieService {

public Zombie setZombie(String name, Integer age) {
Zombie zombie = new Zombie();
zombie.setName(name);
zombie.setAge(age);
return zombie;
}
}

定义配置类

定义一个自动配置类,一般是以 *AutoConfiguration 的形式命名的。

1
2
3
4
5
6
7
8
9
10
@Configuration
@ConditionalOnClass(ZombieService.class)
public class ZombieAutoConfiguration {

@Bean
@ConditionalOnMissingBean(ZombieService.class)
public ZombieService zombieService() {
return new ZombieService();
}
}

常用的注解

  • @ConditionalOnClass:当类路径classpath下有指定的类的情况下进行自动配置

  • @ConditionalOnMissingClass:当类路径下没有指定的类的条件下

  • @ConditionalOnBean:当容器(Spring Context)中有指定的Bean的条件下

  • @ConditionalOnMissingBean:当容器(Spring Context)中没有指定Bean的情况下进行自动配置

配置 spring.factories

resources/META-INF/spring.factories 下配置自动配置类。如果没有该文件的话,需要手动创建。

1
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.qinghuazs.zombie.auto.ZombieAutoConfiguration

打包发布

在发布之前需要在 pom.xml 文件中配置仓库信息

1
2
3
4
5
6
7
8
9
10
11
12
<distributionManagement>
<repository>
<id>qinghuazs-release</id>
<name>qinghuazs-release</name>
<url>http://af.qinghuazs.com.cn:80/artifactory/maven-qinghuazs-release</url>
</repository>
<snapshotRepository>
<id>qinghuazs-snapshot</id>
<name>qinghuazs-snapshot</name>
<url>http://af.qinghuazs.com.cn:80/artifactory/maven-qinghuazs-snapshot</url>
</snapshotRepository>
</distributionManagement>

进行发布

1
2
# mvn clean install 
# mvn deploy

测试

新建测试项目,并在 pom.xml 中引入自定义的 Starter:

1
2
3
4
5
<dependency>
<groupId>com.qinghuazs</groupId>
<artifactId>zombie-spring-boot-starter</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>

自建 Controller 类,并引入 Starter 中的类:

1
2
3
4
5
6
7
8
9
10
11
@RestController
public class TestController {

@Autowired
private ZombieService zombieService;

@GetMapping("/test")
public String test() {
return zombieService.setZombie("qinghuazs", 11).toString();
}
}

使用 Postman 测试,输出结果如下:

1
Zombie(name=qinghuazs, age=11)