SpringBoot-自定義Starter

我們使用 Spring Boot,基本上都是沉醉在它 Stater 的方便之中错忱。Starter 為我們帶來了眾多的自動(dòng)化配置,有了這些自動(dòng)化配置,我們可以不費(fèi)吹灰之力就能搭建一個(gè)生產(chǎn)級(jí)開發(fā)環(huán)境楼咳,有的小伙伴會(huì)覺得這個(gè) Starter 好神奇呀!
其實(shí) Starter 也都是 Spring + SpringMVC 中的基礎(chǔ)知識(shí)點(diǎn)實(shí)現(xiàn)的,今天我們就 自己來寫一個(gè) Starter 烛恤,慢慢揭開 Starter 的神秘面紗!

自定義Starter

其實(shí) Starter 的核心就是條件注解 @Conditional 母怜,當(dāng) classpath 下存在某一個(gè) Class 時(shí),某個(gè)配置才會(huì)生效缚柏。
所謂的 Starter 苹熏,其實(shí)就是一個(gè)普通的 Maven 項(xiàng)目,因此我們自定義 Starter 币喧,需要首先創(chuàng)建一個(gè)普通 的 Maven 項(xiàng)目轨域,創(chuàng)建完成后,添加 Starter 的自動(dòng)化配置類即可:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-autoconfigure</artifactId>
    <version>2.2.7.RELEASE</version>
</dependency>

配置完成后杀餐,我們首先創(chuàng)建一個(gè) HelloProperties 類干发,用來接受 application.properties 中注入的值, 如下:

@ConfigurationProperties(prefix = "tp")
public class HelloProperties {

    private static final String DEFAULT_NAME = "TP";
    private static final String DEFAULT_MSG = "漸行漸遠(yuǎn)";

    private String name = DEFAULT_NAME;
    private String msg = DEFAULT_MSG;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getMsg() {
        return msg;
    }
    public void setMsg(String msg) {
        this.msg = msg;
    }
}

這個(gè)配置類很好理解史翘,將 application.yml 中配置的屬性值直接注入到這個(gè)實(shí)例中枉长, @ConfigurationProperties 類型安全的屬性注入冀续,即將 application.yml 文件中前綴為
tp 的屬性注入到這個(gè)類對應(yīng)的屬性上, 最后使用時(shí)候搀暑,application.yml 中的配置文件沥阳, 大概如下:

tp:
  name: zhangsan
  msg: boot

配置完成 HelloProperties 后,接下來我們來定義一個(gè) HelloService 自点,然后定義一個(gè)簡單的 say 方法桐罕, HelloService 的定義如下:

public class HelloService {

    private String msg;
    private String name;
    
    public String sayHello() {
        return name + " say: " + msg + " !";
    }

    public String getMsg() {
        return msg;
    }
    public void setMsg(String msg) {
        this.msg = msg;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

這個(gè)很簡單,沒啥好說的桂敛。
接下來就是我們的重軸戲功炮,自動(dòng)配置類的定義,用了很多別人定義的自定義類之后术唬,我們也來自己定義一個(gè)類薪伏。代碼如下:

@Configuration
@EnableConfigurationProperties(HelloProperties.class)
@ConditionalOnClass(HelloService.class)
public class HelloServiceAutoConfiguration {
    
    @Autowired
    private HelloProperties helloProperties;
    
    @Bean
    HelloService helloService(){
        HelloService helloService = new HelloService();
        helloService.setName(helloProperties.getName());
        helloService.setMsg(helloProperties.getMsg());
        return helloService;
    }
}

關(guān)于這一段自動(dòng)配置,解釋如下:

  • 首先 @Configuration 注解表明這是一個(gè)配置類粗仓。
  • @EnableConfigurationProperties 注解是使我們之前配置的 @ConfigurationProperties 生效嫁怀, 讓配置的屬性成功的進(jìn)入 Bean 中。
  • @ConditionalOnClass 表示當(dāng)項(xiàng)目當(dāng)前 classpath 下存在 HelloService 時(shí)借浊,后面的配置才生效塘淑。 自動(dòng)配置類中首先注入 HelloProperties ,這個(gè)實(shí)例中含有我們在 application.yml 中配置的相關(guān)數(shù)據(jù)蚂斤。
  • 提供一個(gè) HelloService 的實(shí)例存捺,將 HelloProperties 中的值注入進(jìn)去。

做完這一步之后曙蒸,我們的自動(dòng)化配置類就算是完成了捌治,接下來還需要一個(gè) spring.factories 文件,那么這個(gè)文件是干嘛的呢? 大家知道我們的 Spring Boot 項(xiàng)目的啟動(dòng)類都有一個(gè) @SpringBootApplication 注解纽窟,這個(gè)注解的定義如下:

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
        @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
        @Filter(type = FilterType.CUSTOM,
                classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
}

大家看到這是一個(gè)組合注解肖油,其中的一個(gè)組合項(xiàng)就是 @EnableAutoConfiguration ,這個(gè)注解是干嘛的呢?
@EnableAutoConfiguration 表示啟用 Spring 應(yīng)用程序上下文的自動(dòng)配置臂港,該注解會(huì)自動(dòng)導(dǎo)入一個(gè)名為 AutoConfigurationImportSelector 的類,而這個(gè)類會(huì)去讀取一個(gè)名為 spring.factories 的文件, spring.factories 中則定義需要加載的自動(dòng)化配置類森枪,我們打開任意一個(gè)框架的 Starter ,都能看到它有 一個(gè) spring.factories 文件趋艘,例如 druid 的 Starter 如下:

那么我們自定義 Starter 當(dāng)然也需要這樣一個(gè)文件疲恢,我們首先在 Maven 項(xiàng)目的 resources 目錄下創(chuàng)建 一個(gè)名為 META-INF 的文件夾,然后在文件夾中創(chuàng)建一個(gè)名為 spring.factories 的文件瓷胧,文件內(nèi)容如下:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.tp.spring.boot.starter.config.HelloServiceAutoConfiguration

在這里指定我們的自動(dòng)化配置類的路徑即可显拳,如此之后我們的自動(dòng)化配置類就算完成了。

本地安裝

在正常的公司開發(fā)中搓萧,我們可能需要將這個(gè)自定義starter發(fā)不到公司的maven私服杂数,這里我們就簡單起見宛畦,將這個(gè)starter直接安裝到本地然后進(jìn)行測試:

  • 我們在前文中的boot-demo項(xiàng)目中引入我們自定義的stater:
<!-- 自定義starter -->
<dependency>
  <groupId>com.tp</groupId>
  <artifactId>my-spring-boot-starter</artifactId>
  <version>1.0.0-snapshot</version>
</dependency>
  • 編寫測試類,測試:
@SpringBootTest
class BootDemoApplicationTests {
    
    @Autowired
    private HelloService helloService;

    @Test
    void starterTest(){
        System.out.println(helloService.sayHello());
    }
}

效果如下:


至此我們自定義一個(gè)starter就完成了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末揍移,一起剝皮案震驚了整個(gè)濱河市次和,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌那伐,老刑警劉巖踏施,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異罕邀,居然都是意外死亡畅形,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門诉探,熙熙樓的掌柜王于貴愁眉苦臉地迎上來日熬,“玉大人,你說我怎么就攤上這事肾胯∈” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵敬肚,是天一觀的道長毕荐。 經(jīng)常有香客問我,道長帘皿,這世上最難降的妖魔是什么东跪? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任畸陡,我火速辦了婚禮鹰溜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘丁恭。我一直安慰自己曹动,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布牲览。 她就那樣靜靜地躺著墓陈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪第献。 梳的紋絲不亂的頭發(fā)上贡必,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天,我揣著相機(jī)與錄音庸毫,去河邊找鬼仔拟。 笑死,一個(gè)胖子當(dāng)著我的面吹牛飒赃,可吹牛的內(nèi)容都是我干的利花。 我是一名探鬼主播科侈,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼炒事!你這毒婦竟也來了臀栈?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤挠乳,失蹤者是張志新(化名)和其女友劉穎权薯,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體睡扬,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡崭闲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了威蕉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刁俭。...
    茶點(diǎn)故事閱讀 39,965評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖韧涨,靈堂內(nèi)的尸體忽然破棺而出牍戚,到底是詐尸還是另有隱情,我是刑警寧澤虑粥,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布如孝,位于F島的核電站,受9級(jí)特大地震影響娩贷,放射性物質(zhì)發(fā)生泄漏第晰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一彬祖、第九天 我趴在偏房一處隱蔽的房頂上張望茁瘦。 院中可真熱鬧,春花似錦储笑、人聲如沸甜熔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽腔稀。三九已至,卻和暖如春羽历,著一層夾襖步出監(jiān)牢的瞬間焊虏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工秕磷, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留诵闭,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓跳夭,卻偏偏與公主長得像涂圆,于是被迫代替她去往敵國和親们镜。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評論 2 355