Spring boot創(chuàng)建自定義starter的完整步驟
前言:
Springboot的出現(xiàn)極大的簡(jiǎn)化了開(kāi)發(fā)人員的配置,而這之中的一大利器便是springboot的starter,starter是springboot的核心組成部分,springboot官方同時(shí)也為開(kāi)發(fā)人員封裝了各種各樣方便好用的starter模塊,例如:
- spring-boot-starter-web//spring MVC相關(guān)
- spring-boot-starter-aop //切面編程相關(guān)
- spring-boot-starter-cache //緩存相關(guān)
starter的出現(xiàn)極大的幫助開(kāi)發(fā)者們從繁瑣的框架配置中解放出來(lái),從而更專注于業(yè)務(wù)代碼,而springboot能做的不僅僅停留于此,當(dāng)面對(duì)一些特殊的情況時(shí),我們可以使用我們自定義的springboot starter。
在創(chuàng)建我們自定義的starter之前呢,我們先看看官方是怎么說(shuō)的:
- 模塊
在springboot官方文檔中,特別提到,我們需要?jiǎng)?chuàng)建兩個(gè)module ,其中一個(gè)是autoconfigure module 一個(gè)是 starter module ,其中 starter module 依賴 autoconfigure module
但是,網(wǎng)上仍然有很多blog在說(shuō)這塊的時(shí)候其實(shí)會(huì)發(fā)現(xiàn)他們其實(shí)只用了一個(gè)module,這當(dāng)然并沒(méi)有錯(cuò),這點(diǎn)官方也有說(shuō)明:
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
//如果不需要將自動(dòng)配置代碼和依賴項(xiàng)管理分離開(kāi)來(lái),則可以將它們組合到一個(gè)模塊中。
- 命名規(guī)范
springboot 官方建議springboot官方推出的starter 以spring-boot-starter-xxx的格式來(lái)命名,第三方開(kāi)發(fā)者自定義的starter則以xxxx-spring-boot-starter的規(guī)則來(lái)命名,事實(shí)上,很多開(kāi)發(fā)者在自定義starter的時(shí)候往往會(huì)忽略這個(gè)東西(因?yàn)椴豢垂俜轿臋n很難知道這件事情。同時(shí)也不會(huì)造成其他的后果,主要是顯得不夠?qū)I(yè))。
看看官方的starter
了解了這兩點(diǎn)之后,那么下面讓我們一塊去探索spingboot starter的奧秘吧。
按照springboot官方給的思路,starter的核心module應(yīng)該是autoconfigure,所以我們直接去看spring-boot-autoconfigure里面的內(nèi)容。
當(dāng)Spring Boot啟動(dòng)時(shí),它會(huì)在類路徑中查找名為spring.factories的文件。該文件位于META-INF目錄中。打開(kāi)spring.factories文件,文件內(nèi)容太多了,為了避免我水篇幅,我們只看其中的一部分:
# 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,\
我們可以發(fā)現(xiàn)一些比較眼熟的單詞,比如Aop,Rabbit,Cache ,當(dāng)springboot啟動(dòng)的時(shí)候,將會(huì)嘗試加載這些配置類,如果該路徑下存在該類的話,則將運(yùn)行它,并初始化與該配置類相關(guān)的bean。
點(diǎn)開(kāi)一個(gè)看看:
@Configuration
@ConditionalOnClass({RabbitTemplate.class, Channel.class})
@EnableConfigurationProperties({RabbitProperties.class})
@Import({RabbitAnnotationDrivenConfiguration.class})
public class RabbitAutoConfiguration {
//...代碼略..
}
我們先來(lái)了解一下這幾個(gè)注解:
@ConditionalOnClass :條件注解,當(dāng)classpath下發(fā)現(xiàn)該類的情況下進(jìn)行自動(dòng)配置。
@EnableConfigurationProperties:外部化配置
@Import :引入其他的配置類
當(dāng)然,這并不是一種通用的套路,查看其他的配置類,我們會(huì)發(fā)現(xiàn)其標(biāo)注的注解往往也是有所區(qū)別的。
自定義自己的starter
首先我們新建一個(gè)maven項(xiàng)目,引入以下依賴:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<!-- 我們是基于Springboot的應(yīng)用 -->
<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>
然后我們創(chuàng)建一個(gè)person類,用作后期我們測(cè)試的bean
public class Person {
//屬性
private int age;
private String name;
private String gender;
/*此處省略getter and setter and toStering*/
}
然后我們也創(chuàng)建一個(gè)PersonConfigProperties來(lái)完成我們屬性的注入
@ConfigurationProperties(prefix = "mystarter.config.student")
public class PersonConfigProperties {
private String name;
private int age;
private String gender;
/*
其他的配置信息。。。。
*/
/*此處省略getter and setter and toStering*/
}
最后創(chuàng)建我們的自動(dòng)配置類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;
}
}
我感覺(jué)這是不是做好了?
我不要你覺(jué)得,我要我覺(jué)得
最后我們最重要的一步:
在resourecs文件目錄下創(chuàng)建META-INF,并創(chuàng)建我們自己的spring.factories,并把我們的 MyStarterAutoConfiguration添加進(jìn)去
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.jdkcb.mystarter.config.MyStarterAutoConfiguration
最后打包成jar包,在我們新的項(xiàng)目里面測(cè)試:
測(cè)試:
引入我們的starter,當(dāng)然也可以在本地直接引入我們的my-spring-boot-starter項(xiàng)目
<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配置文件中添加我們相應(yīng)的配置
mystarter.config.enable=true mystarter.config.person.name=小明 mystarter.config.person.age=5 mystarter.config.person.gender=男
新建一個(gè)測(cè)試的Controller:
@RestController
public class TestController {
@Autowired
private Person person;
@RequestMapping("/getPerson")
private Person getStudent() {
return person;
}
}
啟動(dòng)項(xiàng)目,在瀏覽器地址欄輸入 http://127.0.0.1:8080/getPerson ,結(jié)果如下
{"age":5,"name":"小明","gender":"男"}
大功告成~
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。
- spring boot 自定義starter的實(shí)現(xiàn)教程
- springboot自定義Starter的具體流程
- spring boot微服務(wù)自定義starter原理詳解
- springboot自定義starter實(shí)現(xiàn)過(guò)程圖解
- springboot自定義redis-starter的實(shí)現(xiàn)
- SpringBoot自動(dòng)配置之自定義starter的實(shí)現(xiàn)代碼
- 使用SpringBoot自定義starter的完整步驟
- Java SpringBoot自定義starter詳解
- SpringBoot如何自定義starter
- SpringBoot自定義start詳細(xì)圖文教程
相關(guān)文章
Java基于享元模式實(shí)現(xiàn)五子棋游戲功能實(shí)例詳解
這篇文章主要介紹了Java基于享元模式實(shí)現(xiàn)五子棋游戲功能,較為詳細(xì)的分析了享元模式的概念、功能并結(jié)合實(shí)例形式詳細(xì)分析了Java使用享元模式實(shí)現(xiàn)五子棋游戲的具體操作步驟與相關(guān)注意事項(xiàng),需要的朋友可以參考下2018-05-05
Java實(shí)現(xiàn)幾種序列化方式總結(jié)
本篇文章主要介紹了Java實(shí)現(xiàn)幾種序列化方式總結(jié),包括Java原生以流的方法進(jìn)行的序列化、Json序列化、FastJson序列化、Protobuff序列化,有興趣的可以了解一下,2017-03-03
MyBatisPlus查詢報(bào)錯(cuò)Unknow?column?‘id‘?in?‘field?list‘解決分析
這篇文章主要為大家介紹了MyBatisPlus查詢報(bào)錯(cuò)Unknow?column?‘id‘?in?‘field?list‘解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
SpringBoot跨域問(wèn)題的解決方法實(shí)例
這篇文章主要給大家介紹了關(guān)于SpringBoot跨域問(wèn)題的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05
idea推送項(xiàng)目到gitee中的創(chuàng)建方法
這篇文章主要介紹了idea推送項(xiàng)目到gitee中的創(chuàng)建方法,本文通過(guò)圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08
解決java.lang.NullPointerException報(bào)錯(cuò)以及分析出現(xiàn)的幾種原因
這篇文章介紹了解決java.lang.NullPointerException報(bào)錯(cuò)的方法,以及分析出現(xiàn)的幾種原因。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12
springcloud如何獲取網(wǎng)關(guān)封裝的頭部信息
這篇文章主要介紹了springcloud獲取網(wǎng)關(guān)封裝的頭部信息,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06

