如何編寫自己的starter

命名規(guī)則:

????不要使用spring-boot開(kāi)頭的,以避免將來(lái)spring-boot官方使用你的starter而重名。

? ? 正例:xxxx-spring-boot-starter

? ? 反例:spring-boot-starter-xxxx

功能界定:

????你所定義的starter需要有自己的獨(dú)特功能,比如spring-boot-starter-web 提供的springmvc相關(guān)的自動(dòng)裝配,內(nèi)嵌tomcat以及相關(guān)依賴,那們你自己定義的starter也是需要界定好自己的功能。示例中我們定義一個(gè)用于指定項(xiàng)目作者名的一個(gè)starter,并實(shí)現(xiàn)自動(dòng)裝配一個(gè)作者服務(wù)類(如果不存在實(shí)例的情況下)

項(xiàng)目起步:

? ? 1:pom文件引入

1

processor 主要的作用是在編譯時(shí)在META-INF下生成spring-configuration-metadata.json 文件,該文件主要為IDE使用,即可以通過(guò)在application.properties文件中通過(guò)ctrl + 點(diǎn)擊進(jìn)入配置屬性所在的類中。

autoconfigure 主要作用是提供自動(dòng)裝配功能

代碼編寫:

1:編寫配置文件讀取類,一般命名為xxxProperties.class

2

這樣就可以在配置文件中,使用前綴為wilson.custom.author = xxx 的形式配置了

2:編寫需要你這個(gè)功能的服務(wù)類,即自動(dòng)裝配類會(huì)根據(jù)classpath下是否存在該服務(wù)類,如果存在就加載我們的自動(dòng)裝配類,并在不存在該服務(wù)類實(shí)例的情況下去實(shí)例化服務(wù)類的bean實(shí)例

3

3:編寫自動(dòng)裝配類,主要點(diǎn)

4

首先看類上的注解有@Configuration,@ConditionOnClass以及@EnableConfigurationProperties

@Configuration:spring配置,省略了xml配置文件

@ConditionOnClass 當(dāng)classpath下存在指定類時(shí),該配置類才有效。

@EnableConfigurationProperties 支持配置屬性

在看里面的方法上的注解有

@Bean 表示會(huì)注冊(cè)為一個(gè)spring bean

@ConditionOnMissingBean(AuthorServer.class)表示當(dāng)spring上下文中不存在AuthorServer實(shí)例時(shí)才會(huì)加載該方法以生成實(shí)例。

@ConditionOnProperties 表示當(dāng)配置文件中存在該配置時(shí),才會(huì)加載該方法,若加了matchIfMissing = true,則表示即使配置文件中沒(méi)有定義該屬性配置,也會(huì)加載該方法

方法體的代碼很簡(jiǎn)單,就是獲取到配置文件中配置的值,放進(jìn)AuthorServer 實(shí)例中,并返回實(shí)例。

備注:springboot中相關(guān)condition注解大致有:

@ConditionalOnBean:當(dāng)容器中有指定的Bean的條件下

@ConditionalOnClass:當(dāng)類路徑下有指定的類的條件下?

@ConditionalOnExpression:基于SpEL表達(dá)式作為判斷條件?

@ConditionalOnJava:基于JVM版本作為判斷條件?

@ConditionalOnJndi:在JNDI存在的條件下查找指定的位置?

@ConditionalOnMissingBean:當(dāng)容器中沒(méi)有指定Bean的情況下?

@ConditionalOnMissingClass:當(dāng)類路徑下沒(méi)有指定的類的條件下?

@ConditionalOnNotWebApplication:當(dāng)前項(xiàng)目不是Web項(xiàng)目的條件下?

@ConditionalOnProperty:指定的屬性是否有指定的值?

@ConditionalOnResource:類路徑下是否有指定的資源?

@ConditionalOnSingleCandidate:當(dāng)指定的Bean在容器中只有一個(gè),或者在有多個(gè)Bean的情況下,用來(lái)指定首選的Bean @ConditionalOnWebApplication:當(dāng)前項(xiàng)目是Web項(xiàng)目的條件下

4:編寫 spring.factories文件,指定autoconfigure加載的自動(dòng)裝配類是哪個(gè)

? ? 在項(xiàng)目的resources下定義一個(gè)META-INF? ?文件夾,并新建spring.factories文件

6

? 5:最后一步:

? ? 修改pom文件中關(guān)于build 插件 spring-boot-maven-plugin,增加一個(gè)

7

如果不增加這個(gè),會(huì)導(dǎo)致執(zhí)行maven clean install 后,在其他項(xiàng)目中引用我們定義的這個(gè)pom時(shí)出現(xiàn)找不到class文件的報(bào)錯(cuò)信息

比如我們另起一個(gè)新的springboot項(xiàng)目,增加上述定義的starter的pom依賴后,啟動(dòng)

報(bào)錯(cuò)信息如下:

8

打開(kāi)IDE外部jar依賴看到,

9

所以它找不到class文件。只要在上述自定義pom中的打包maven插件增加<skip>true</>即可。

10


11

再次啟動(dòng),成功。

結(jié)語(yǔ):

? ? 定義自己的starter,用到了自動(dòng)裝配,其實(shí)是springboot在啟動(dòng)時(shí),會(huì)自動(dòng)去掃描每個(gè)starter中META-INF下的spring.factories文件中定義的key 為org.springframework.boot.autoconfigure.EnableAutoConfiguration的所有value值,合并到一起再去根據(jù)整個(gè)項(xiàng)目的classpath jar只能的處理所有定義的需要自動(dòng)裝配的類的。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,285評(píng)論 6 342
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,692評(píng)論 19 139
  • 1.1 spring IoC容器和beans的簡(jiǎn)介 Spring 框架的最核心基礎(chǔ)的功能是IoC(控制反轉(zhuǎn))容器,...
    simoscode閱讀 6,856評(píng)論 2 22
  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架,建立于...
    Hsinwong閱讀 22,968評(píng)論 1 92
  • 1.1 Spring IoC容器和bean簡(jiǎn)介 本章介紹了Spring Framework實(shí)現(xiàn)的控制反轉(zhuǎn)(IoC)...
    起名真是難閱讀 2,680評(píng)論 0 8

友情鏈接更多精彩內(nèi)容