springboot中starter的編寫

springboot相較于spring的一大優(yōu)點就是提供給我們開箱即用的一些組件,例如spring-starter依賴溶锭。它內(nèi)部引入相關(guān)組件的jar包,并且封裝了一些默認(rèn)配置趴捅。讓我們在開發(fā)業(yè)務(wù)時能夠?qū)W⒂跇I(yè)務(wù)的編寫而不必過多的關(guān)注框架的配置垫毙。

springboot-starter的原理

我們使用spring組件的時候拱绑,例如redis综芥,只需將對應(yīng)的spring-boot-starter-redis通過pom引入即可猎拨,不用自己去查找、引入一系列所需的依賴類迟几。同時消请,SpringBoot會自動進(jìn)行類的自動配置类腮,并將相關(guān)的Bean注入Spring Conxtex中。
首先蚜枢,SpringBoot 在啟動時會去依賴的starter包中尋找 resources/META-INF/spring.factories文件缸逃,然后根據(jù)文件中配置去掃描項目所依賴的Jar包厂抽,這類似于 Java 的 SPI 機(jī)制。

第二步筷凤,根據(jù) spring.factories配置加載AutoConfigure類昭殉。

最后藐守,根據(jù)@Conditional注解的條件挪丢,進(jìn)行自動配置并將Bean注入Spring Context 上下文當(dāng)中卢厂。

我們也可以使用@ImportAutoConfiguration({MyServiceAutoConfiguration.class})指定自動配置哪些類。

實現(xiàn)

第一步創(chuàng)建一個SpringBoot項目慎恒,添加兩個依賴項目中

<dependencies>
<!--負(fù)責(zé)從properties文件中讀取配置信息-->
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <version>2.1.5.RELEASE</version>
  </dependency>
<!--實現(xiàn)自動化配置-->
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-autoconfigure</artifactId>
    <version>2.1.3.RELEASE</version>
  </dependency>
</dependencies>

其中spring-boot-configuration-processor 的作用是編譯時生成spring-configuration-metadata.json ,此文件主要給IDE使用融柬。如當(dāng)配置此jar相關(guān)配置屬性在 application.yml死嗦,你可以用ctlr+鼠標(biāo)左鍵點擊屬性名粒氧,IDE會跳轉(zhuǎn)到你配置此屬性的類中越走。

我們?nèi)粘J褂玫腟pring官方的Starter一般采取spring-boot-starter-{name}的命名方式,如 spring-boot-starter-web 。

而非官方的Starter门怪,官方建議 artifactId 命名應(yīng)遵循{name}-spring-boot-starter的格式骡澈。 例如:ysc-spring-boot-starter 掷空。

<groupId>com.dy</groupId>
<artifactId>zcl-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>

編寫三個重要的類

  • Service類
    該類實現(xiàn)具體的功能,包含一個能夠?qū)⑴渲梦募信渲玫淖址鶕?jù)傳入的字符進(jìn)行分割的方法String[] split(String separatorChar)坦弟。
public class StarterService {
    private String config;

    public StarterService(String config) {
        this.config = config;
    }

    public String[] split(String splitChar) {
        return config.split(splitChar);
    }
}

  • 配置文件讀取類
@ConfigurationProperties("example.service")
public class StarterServiceProperties {
    private String config;
    
    public void setConfig(String config) {
        this.config = config;
    }
    
    public String getConfig() {
        return config;
    }
 }
  • AutoConfigure類
@Configuration
@ConditionalOnClass(StarterService.class)
@EnableConfigurationProperties(StarterServiceProperties.class)
public class StarterAutoConfigure {

    @Autowired
    private StarterServiceProperties properties;

    @Bean
    @ConditionalOnMissingBean
    @ConditionalOnProperty(prefix = "example.service", value = "enabled", havingValue = "true")
    StarterService starterService (){
        return new StarterService(properties.getConfig());
    }

}

@ConditionalOnClass护锤,當(dāng)classpath下發(fā)現(xiàn)該類的情況下進(jìn)行自動配置StarterService酿傍。
@ConditionalOnMissingBean,當(dāng)Spring Context中不存在該Bean時赤炒。
@ConditionalOnProperty(prefix = "example.service",value = "enabled",havingValue = "true")氯析,當(dāng)配置文件中example.service.enabled=true時莺褒,執(zhí)行該方法。

在resources/META-INF/下創(chuàng)建spring.factories文件
這里注意改為你自己的包名

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.zcl.StarterAutoConfigure

發(fā)布

使用mvn install打包安裝

測試

引入starter

<dependency>
    <groupId>com.dy</groupId>
    <artifactId>zcl-spring-boot-starter</artifactId>
    <version>1.0-SNAPSHOT</version>
  </dependency>

在application.yml中編寫配置文件

example:
  service:
    enabled: true
    config: gsdf, fd, fasd

配置junit4進(jìn)行測試

@RunWith(value = SpringJUnit4ClassRunner.class)
//這里App類為springboot的啟動類
@SpringBootTest(classes = {App.class})
public class MyTest {

    @Autowired
    private StarterService starterService;

    @Test
    public void starterTest() {
        String[] splitArray = starterService.split(",");
        System.out.println(Arrays.toString(splitArray));
    }
}

結(jié)果
[gsdf, fd, fasd]

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末遵岩,一起剝皮案震驚了整個濱河市你辣,隨后出現(xiàn)的幾起案子尘执,更是在濱河造成了極大的恐慌,老刑警劉巖正卧,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蠢熄,死亡現(xiàn)場離奇詭異炉旷,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)窘行,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進(jìn)店門饥追,熙熙樓的掌柜王于貴愁眉苦臉地迎上來罐盔,“玉大人,你說我怎么就攤上這事∧笏常” “怎么了六孵?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵幅骄,是天一觀的道長劫窒。 經(jīng)常有香客問我拆座,道長,這世上最難降的妖魔是什么挪凑? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任孕索,我火速辦了婚禮躏碳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘唐断。我一直安慰自己选脊,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布恳啥。 她就那樣靜靜地躺著,像睡著了一般丹诀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上铆遭,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天硝桩,我揣著相機(jī)與錄音枚荣,去河邊找鬼。 笑死橄妆,一個胖子當(dāng)著我的面吹牛衙伶,可吹牛的內(nèi)容都是我干的害碾。 我是一名探鬼主播矢劲,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼慌随,長吁一口氣:“原來是場噩夢啊……” “哼躺同!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起丸逸,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎椭员,沒想到半個月后车海,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體隘击,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡研铆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年埋同,在試婚紗的時候發(fā)現(xiàn)自己被綠了棵红。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡逆甜,死狀恐怖虱肄,靈堂內(nèi)的尸體忽然破棺而出交煞,到底是詐尸還是另有隱情咏窿,我是刑警寧澤素征,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站御毅,受9級特大地震影響根欧,放射性物質(zhì)發(fā)生泄漏端蛆。R本人自食惡果不足惜凤粗,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一今豆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧晚凿,春花似錦亭罪、人聲如沸歼秽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽箩祥。三九已至,卻和暖如春袍祖,著一層夾襖步出監(jiān)牢的瞬間底瓣,已是汗流浹背蕉陋。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留凳鬓,地道東北人茁肠。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓缩举,卻偏偏與公主長得像垦梆,于是被迫代替她去往敵國和親仅孩。 傳聞我的和親對象是個殘疾皇子托猩,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,871評論 2 354

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