命名規(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文件引入
processor 主要的作用是在編譯時(shí)在META-INF下生成spring-configuration-metadata.json 文件征讲,該文件主要為IDE使用据某,即可以通過(guò)在application.properties文件中通過(guò)ctrl + 點(diǎn)擊進(jìn)入配置屬性所在的類中。
autoconfigure 主要作用是提供自動(dòng)裝配功能
代碼編寫:
1:編寫配置文件讀取類诗箍,一般命名為xxxProperties.class
這樣就可以在配置文件中哗脖,使用前綴為wilson.custom.author = xxx 的形式配置了
2:編寫需要你這個(gè)功能的服務(wù)類,即自動(dòng)裝配類會(huì)根據(jù)classpath下是否存在該服務(wù)類扳还,如果存在就加載我們的自動(dòng)裝配類才避,并在不存在該服務(wù)類實(shí)例的情況下去實(shí)例化服務(wù)類的bean實(shí)例
3:編寫自動(dòng)裝配類,主要點(diǎn)
首先看類上的注解有@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文件
? 5:最后一步:
? ? 修改pom文件中關(guān)于build 插件 spring-boot-maven-plugin竣蹦,增加一個(gè)
如果不增加這個(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ò)信息如下:
打開(kāi)IDE外部jar依賴看到滔吠,
所以它找不到class文件。只要在上述自定義pom中的打包maven插件增加<skip>true</>即可挠日。
再次啟動(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)裝配的類的。