Springboot 之建立自定義starter
前言:
Springboot的出現極大的簡化了開發人員的配置,而這之中的一大利器便是springboot的starter,starter是springboot的核心組成部分,springboot官方同時也為開發人員封裝了各種各樣方便好用的starter模組,例如:
- spring-boot-starter-web//spring MVC相關
- spring-boot-starter-aop //切面程式設計相關
- spring-boot-starter-cache //快取相關
starter的出現極大的幫助開發者們從繁瑣的框架配置中解放出來,從而更專注於業務程式碼,而springboot能做的不僅僅停留於此,當面對一些特殊的情況時,我們可以使用我們自定義的springboot starter
在建立我們自定義的starter之前呢,我們先看看官方是怎麼說的:
-
模組
在springboot官方檔案中,特別提到,我們需要建立兩個module ,其中一個是autoconfigure module 一個是 starter module ,其中 starter module 依賴 autoconfigure module
但是,網上仍然有很多blog在說這塊的時候其實會發現他們其實只用了一個module,這當然並沒有錯,這點官方也有說明:
You may combine the auto-configuration code and the dependency management in a single module if you do not need to separate those two concerns //如果不需要將自動配置程式碼和依賴項管理分離開來,則可以將它們組合到一個模組中。 複製程式碼
-
命名規範
springboot 官方建議springboot官方推出的starter 以spring-boot-starter-xxx的格式來命名,第三方開發者自定義的starter則以xxxx-spring-boot-starter的規則來命名,事實上,很多開發者在自定義starter的時候往往會忽略這個東西(因為不看官方檔案很難知道這件事情。同時也不會造成其他的後果,主要是顯得不夠專業)。
看看官方的starter
瞭解了這兩點之後,那麼下面讓我們一塊去探索spingboot starter的奧祕吧。
按照springboot官方給的思路,starter的核心module應該是autoconfigure,所以我們直接去看spring-boot-autoconfigure裡面的內容。
當Spring Boot啟動時,它會在類路徑中查詢名為spring.factories的檔案。該檔案位於META-INF目錄中。開啟spring.factories檔案,檔案內容太多了,為了避免我水篇幅,我們只看其中的一部分:
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
複製程式碼
我們可以發現一些比較眼熟的單詞,比如Aop,Rabbit,Cache ,當springboot啟動的時候,將會嘗試載入這些配置類,如果該路徑下存在該類的話,則將執行它,並初始化與該配置類相關的bean。
點開一個看看:
@Configuration
@ConditionalOnClass({RabbitTemplate.class,Channel.class})
@EnableConfigurationProperties({RabbitProperties.class})
@Import({RabbitAnnotationDrivenConfiguration.class})
public class RabbitAutoConfiguration {
//...程式碼略..
}
複製程式碼
我們先來瞭解一下這幾個註解:
@ConditionalOnClass :條件註解,當classpath下發現該類的情況下進行自動配置。
@EnableConfigurationProperties:外部化配置
@Import :引入其他的配置類
當然,這並不是一種通用的套路,檢視其他的配置類,我們會發現其標註的註解往往也是有所區別的。
自定義自己的starter
首先我們新建一個maven專案,引入以下依賴:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<!-- 我們是基於Springboot的應用 -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
複製程式碼
然後我們建立一個person類,用作後期我們測試的bean
public class Person {
//屬性
private int age;
private String name;
private String gender;
/*此處省略getter and setter and toStering*/
}
複製程式碼
然後我們也建立一個PersonConfigProperties來完成我們屬性的注入
@ConfigurationProperties(prefix = "mystarter.config.student")
public class PersonConfigProperties {
private String name;
private int age;
private String gender;
/*
其他的配置資訊。。。。
*/
/*此處省略getter and setter and toStering*/
}
複製程式碼
最後建立我們的自動配置類MyStarterAutoConfiguration.java
@Configuration
@EnableConfigurationProperties(PersonConfigProperties.class)
@ConditionalOnClass(Person.class)
public class MyStarterAutoConfiguration {
@Bean
@ConditionalOnProperty(prefix = "mystarter.config",name = "enable",havingValue = "true")
public Person defaultStudent(PersonConfigProperties personConfigProperties) {
Person person = new Person();
person.setAge(personConfigProperties.getAge());
person.setName(personConfigProperties.getName());
person.setGender(personConfigProperties.getGender());
return person;
}
}
複製程式碼
我感覺這是不是做好了?
我不要你覺得,我要我覺得
最後我們最重要的一步:
在resourecs檔案目錄下建立META-INF,並建立我們自己的spring.factories,並把我們的 MyStarterAutoConfiguration新增進去
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.jdkcb.mystarter.config.MyStarterAutoConfiguration
複製程式碼
最後打包成jar包,在我們新的專案裡面測試:
測試:
引入我們的starter,當然也可以在本地直接引入我們的my-spring-boot-starter專案
<dependency>
<groupId>com.jdkcb</groupId>
<artifactId>my-spring-boot-starter</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/resources/lib/my-spring-boot-starter-0.0.1-SNAPSHOT.jar</systemPath>
</dependency>
複製程式碼
在application.properties配置檔案中新增我們相應的配置
mystarter.config.enable=true
mystarter.config.person.name=小明
mystarter.config.person.age=5
mystarter.config.person.gender=男
複製程式碼
新建一個測試的Controller:
@RestController
public class TestController {
@Autowired
private Person person;
@RequestMapping("/getPerson")
private Person getStudent() {
return person;
}
}
複製程式碼
啟動專案,在瀏覽器位址列輸入 http://127.0.0.1:8080/getPerson,結果如下
{"age":5,"name":"小明","gender":"男"}
複製程式碼
大功告成~
最後的最後,大家好,我是韓數,哼,關注我,有你好果子吃(叉腰)。
記得點個贊再走哦~