我們在使用springboot的時候,感覺特别的友善易用。原因就是springboot官方提供了很多starter,我們需要使用什麼功能,隻需要引入對應的starter就可以了,大大簡化了配置,這就是springboot當中約定大于配置特性。
那麼這些starter到底是如何工作的呢?下面我們來自建一個自己的springboot starter,進而對裡面的特性一探究竟。
項目名稱
spring官方的starter的名稱一般都是下面的格式:spring-boot-starter-xxxxx,例如spring-boot-starter-actuator、spring-boot-starter-web
而非官方的starter官方建議命名為:xxxxx-spring-boot-starter,是以建立一個springboot工程,命名這個工程為:userdefined-spring-boot-starter
pom檔案
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.9.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.fsl</groupId>
<artifactId>userdefined-spring-boot-starter</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>userdefined-spring-boot-starter</name>
<description>Demo project for Spring Boot</description>
<packaging>jar</packaging><!-- 必須有這個設定,否則無法執行maven install打包到maven倉庫供别人引用 -->
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- starter的依賴 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
</dependencies>
</project>
自定義的配置屬性
@ConfigurationProperties("my.defined")
public class MyDefinedProperties {
/**
* 姓名
*/
private String name;
/**
* 年齡
*/
private Integer age;
/**
* 家鄉位址
*/
private String hometown;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getHometown() {
return hometown;
}
public void setHometown(String hometown) {
this.hometown = hometown;
}
@Override
public String toString() {
return "MyDefinedProperties{" +
"name='" + name + '\'' +
", age=" + age +
", hometown='" + hometown + '\'' +
'}';
}
}
自定義的service
public class MyDefinedService {
MyDefinedProperties myDefinedProperties;
public MyDefinedProperties getMyDefinedProperties() {
return myDefinedProperties;
}
public void setMyDefinedProperties(MyDefinedProperties helloProperties) {
this.myDefinedProperties = helloProperties;
}
public String sayHello() {
return String.format("[name=%s, age=%d, hometown=%s]",
myDefinedProperties.getName(),
myDefinedProperties.getAge(),
myDefinedProperties.getHometown());
}
}
加載service
@Configuration
//web工程生效
@ConditionalOnWebApplication
@EnableConfigurationProperties(MyDefinedProperties.class)
public class MyDefinedServiceAutoConfiguration {
@Autowired
MyDefinedProperties myDefinedProperties;
@Bean
@ConditionalOnMissingBean(MyDefinedService.class)
@ConditionalOnProperty//存在對應配置資訊時初始化該配置類
(
prefix = "my.defined",//存在配置字首my.defined
name = "enabled",
havingValue = "true",//開啟
matchIfMissing = true//缺失檢查
)
public MyDefinedService myDefinedService2() {
MyDefinedService service = new MyDefinedService();
service.setMyDefinedProperties(myDefinedProperties);
return service;
}
}
配置啟動類
在resources目錄下面,建立META-INF檔案夾,裡面建立spring.factories檔案,檔案内容如下:
#配置自定義Starter的自動化配置
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.fsl.userdefinedspringbootstarter.MyDefinedServiceAutoConfiguration
執行maven insatll打包指令
項目的整體結構如下:

執行maven install指令打包項目
别的項目引用這個starter
在另外的工程當中引入對應的依賴
<!--引入自定義的starter-->
<dependency>
<groupId>com.fsl</groupId>
<artifactId>userdefined-spring-boot-starter</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
配置屬性
#設定自定義starter的參數
my.defined.name=ydd
my.defined.age=18
my.defined.hometown=jiangxi
my.defined.enabled = true
可以直接注入上面的service
@RestController
public class IndexController {
@Autowired
private MyDefinedService myDefinedService;
@GetMapping("/index")
public String index(){
return myDefinedService.sayHello();
}
}
運作結果