如何編寫自己的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)系作者
  • 序言:七十年代末夜涕,一起剝皮案震驚了整個(gè)濱河市犯犁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌女器,老刑警劉巖酸役,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異驾胆,居然都是意外死亡涣澡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門丧诺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)入桂,“玉大人,你說(shuō)我怎么就攤上這事驳阎】钩睿” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵呵晚,是天一觀的道長(zhǎng)蜘腌。 經(jīng)常有香客問(wèn)我,道長(zhǎng)饵隙,這世上最難降的妖魔是什么撮珠? 我笑而不...
    開(kāi)封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮金矛,結(jié)果婚禮上劫瞳,老公的妹妹穿的比我還像新娘。我一直安慰自己绷柒,他們只是感情好志于,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著废睦,像睡著了一般伺绽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天奈应,我揣著相機(jī)與錄音澜掩,去河邊找鬼。 笑死杖挣,一個(gè)胖子當(dāng)著我的面吹牛肩榕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播惩妇,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼株汉,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了歌殃?” 一聲冷哼從身側(cè)響起乔妈,我...
    開(kāi)封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎氓皱,沒(méi)想到半個(gè)月后路召,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡波材,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年股淡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片廷区。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡唯灵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出躲因,到底是詐尸還是另有隱情早敬,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布大脉,位于F島的核電站搞监,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏镰矿。R本人自食惡果不足惜琐驴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望秤标。 院中可真熱鬧绝淡,春花似錦、人聲如沸苍姜。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)衙猪。三九已至馍乙,卻和暖如春布近,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背丝格。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工撑瞧, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人显蝌。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓预伺,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親曼尊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子酬诀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

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