欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot如何自定義starter

 更新時(shí)間:2022年01月18日 09:39:13   作者:碼農(nóng)洞見(jiàn)  
這篇文章主要介紹了SpringBoot如何自定義starter,Springboot的出現(xiàn)極大的簡(jiǎn)化了開(kāi)發(fā)人員的配置,而這之中的一大利器便是springboot的starter,starter是springboot的核心組成部分,下面來(lái)看看集體引用過(guò)程吧

1. 什么是starter

Springboot的出現(xiàn)極大的簡(jiǎn)化了開(kāi)發(fā)人員的配置,而這之中的一大利器便是springboot的starter,starter是springboot的核心組成部分,為什么說(shuō)引入如下依賴就滿足了日常web開(kāi)發(fā)?

<dependency>
? <groupId>org.springframework.boot</groupId>
? <artifactId>spring-boot-starter-web</artifactId>
</dependency>

而不使用springboot時(shí),需要引入spring-web、spring-webmvcspring-aop等等。實(shí)際上那些必要的依賴在spring-boot-starter-web中已經(jīng)被引入了,引入這個(gè)組名就引入了所有的依賴。

2. 自動(dòng)配置原理

springboot在啟動(dòng)的時(shí)候會(huì)加載主配置類,開(kāi)啟了@EnableAutoConfiguration。

@EnableAutoConfiguration的作用:

利用AutoConfigurationImportSelector給容器導(dǎo)入一些組件。
查看selectImports方法的內(nèi)容,返回一個(gè)AutoConfigurationEntry
可以看到SpringFactoriesLoader.loadFactoryNames,繼續(xù)看又調(diào)用了loadSpringFactories方法,獲取META-INF/spring.factories資源文件。這個(gè)spring.factories文件也是一組一組的key=value的形式,其中一個(gè)key是EnableAutoConfiguration類的全類名,而它的value是一個(gè)xxxxAutoConfiguration的類名的列表,這些類名以逗號(hào)分隔,最后都加入到容器中,用來(lái)做自動(dòng)配置,每一個(gè)自動(dòng)配置類都可以進(jìn)行自動(dòng)配置功能使用HttpEncodingAutoConfiguration來(lái)解釋自動(dòng)裝配原理。根據(jù)當(dāng)前不同的條件判斷,決定這個(gè)配置類是否生效!

2.1 自動(dòng)配置生效

每一個(gè)XxxxAutoConfiguration自動(dòng)配置類都是在某些條件之下才會(huì)生效的,這些條件的限制在Spring Boot中以注解的形式體現(xiàn),

常見(jiàn)的條件注解有如下幾項(xiàng):

  • @Conditional擴(kuò)展注解 作用
  • @ConditionalOnJava 系統(tǒng)的java版本是否符合要求
  • @ConditionalOnBean 容器中存在指定Bean
  • @ConditionalOnMissingBean 容器中不存在指定Bean
  • @ConditionalOnExpression 滿足SpEL表達(dá)式
  • @ConditionalOnClass 系統(tǒng)中有指定的類
  • @ConditionalOnMissingClass 系統(tǒng)中沒(méi)有指定的類
  • @ConditionalOnSingleCandidate 容器中只有一個(gè)指定的Bean,或者是首選Bean
  • @ConditionalOnProperty 系統(tǒng)中指定的屬性是否有指定的值
  • @ConditionalOnResource 類路徑下是否存在指定資源文件
  • @ConditionOnWebApplication 當(dāng)前是web環(huán)境
  • @ConditionalOnNotWebApplication 當(dāng)前不是web環(huán)境

自動(dòng)配置原理總結(jié)如下:

  •     1、Spring Boot啟動(dòng)的時(shí)候會(huì)通過(guò)@EnableAutoConfiguration注解找到META-INF/spring.factories配置文件中的所有自動(dòng)配置類進(jìn)行加載
  •     2、這些自動(dòng)配置類都是以AutoConfiguration結(jié)尾來(lái)命名的,它實(shí)際上就是一個(gè)JavaConfig形式的Spring容器配置類
  •     3、自動(dòng)配置類通過(guò)以Properties結(jié)尾命名的類中取得在全局配置文件中配置的屬性如:server.port,而XxxxProperties類是通過(guò)@ConfigurationProperties注解與全局配置文件中對(duì)應(yīng)的屬性進(jìn)行綁定的。

3. 自定義starter

spring-boot有兩種starter:

一種是內(nèi)部已經(jīng)支持的,其通過(guò)@ConditionalOnClass來(lái)實(shí)決定是否例化(ConditionalOnClass是指當(dāng)在classpath發(fā)現(xiàn)需要的依賴的類時(shí)實(shí)例化),想要啟動(dòng)這個(gè)服務(wù),只要要配置上對(duì)應(yīng)的starter,這個(gè)starter就能把所需要的jar給關(guān)聯(lián)上。
一種是第三方的,比如mybatis等。原理是一樣的,就是在你已經(jīng)實(shí)現(xiàn)的服務(wù)代碼之上封裝一層配置代碼就行。
基于這個(gè)機(jī)制,我們自己也可以實(shí)現(xiàn)一個(gè)。自定義starter,我們要做的事情是兩個(gè):確定依賴和編寫自動(dòng)配置。我們重點(diǎn)要做的就是編寫自動(dòng)配置,我們之前寫過(guò)一些自動(dòng)配置,主要是注解配置的使用,主要的注解有:

  • @Configuration :指定這個(gè)類是一個(gè)配置類
  • @ConditionalOnXXX :在指定條件成立的情況下自動(dòng)配置類生效
  • @AutoConfigureAfter:指定自動(dòng)配置類的順序
  • @Bean:給容器中添加組件
  • @ConfigurationPropertie:結(jié)合相關(guān)xxxProperties類來(lái)綁定相關(guān)的配置
  • @EnableConfigurationProperties:讓xxxProperties生效加入到容器中

3.1 命名規(guī)范

SpringBoot提供的starter以spring-boot-starter-xxx的方式命名的。官方建議自定義的starter使用xxx-spring-boot-starter命名規(guī)則。以區(qū)分SpringBoot生態(tài)提供的starter。

官方命名空間:

  • 前綴:“spring-boot-starter-”
  • 模式:spring-boot-starter-模塊名
  • 舉例:spring-boot-starter-web、spring-boot-starter-jdbc

自定義命名空間:

  • 后綴:“-spring-boot-starter”
  • 模式:模塊-spring-boot-starter
  • 舉例:druid-spring-boot-startermybatis-spring-boot-starter

4.總結(jié)

Starter可以理解為一個(gè)可拔插式的插件,提供一系列便利的依賴描述符,您可以獲得所需的所有Spring和相關(guān)技術(shù)的一站式服務(wù)。應(yīng)用程序只需要在maven中引入starter依賴,SpringBoot就能自動(dòng)掃描到要加載的信息并啟動(dòng)相應(yīng)的默認(rèn)配置。

4.1為什么要自定義starter?

在我們的日常開(kāi)發(fā)工作中,經(jīng)常會(huì)有一些獨(dú)立于業(yè)務(wù)之外的配置模塊,我們經(jīng)常將其放到一個(gè)特定的包下,然后如果另一個(gè)工程需要復(fù)用這塊功能的時(shí)候,需要將代碼硬拷貝到另一個(gè)工程,重新集成一遍,麻煩至極。如果我們將這些可獨(dú)立于業(yè)務(wù)代碼之外的功能配置模塊封裝成一個(gè)個(gè)starter,復(fù)用的時(shí)候只需要將其在pom中引用依賴即可。

4.2 自定義starter的案例

以下案例由筆者工作中遇到的部分場(chǎng)景

動(dòng)態(tài)數(shù)據(jù)源。 — fs-dynamic-starter
登錄模塊(權(quán)限)。— fs-auth-client-starter
基于AOP技術(shù)實(shí)現(xiàn)日志切面。—fs-common-starter
案例地址:https://gitee.com/Manoninsight/fullset/tree/master/fs-starter

這里還有一個(gè)小細(xì)節(jié),你如果仔細(xì)查看我的案例會(huì)發(fā)下一個(gè)問(wèn)題,就是我自定義的starter里并沒(méi)有META-INF/spring.factories配置文件,為什么還能生效呢?這是因?yàn)槲业捻?xiàng)目用的統(tǒng)一的包路徑:com.fs。spring配置默認(rèn)會(huì)掃描當(dāng)前的包路徑,所以能加載到。但是筆者建議還是加上META-INF/spring.factories配置文件。

到此這篇關(guān)于SpringBoot如何自定義starter的文章就介紹到這了,更多相關(guān)SpringBoot自定義starter內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 通過(guò)Java代碼技巧改善性能

    通過(guò)Java代碼技巧改善性能

    在本篇文章里小編給大家分享了關(guān)于通過(guò)Java代碼技巧改善性能的相關(guān)知識(shí)點(diǎn),需要的朋友們參考下。
    2019-05-05
  • Java面試??贾瓹oncurrentHashMap多線程擴(kuò)容機(jī)制詳解

    Java面試??贾瓹oncurrentHashMap多線程擴(kuò)容機(jī)制詳解

    幾乎所有的后端技術(shù)面試官都要在?ConcurrentHashMap?技術(shù)的使用和原理方面對(duì)小伙伴們進(jìn)行刁難,本文主要來(lái)和大家聊聊ConcurrentHashMap多線程的擴(kuò)容機(jī)制,希望對(duì)大家有所幫助
    2023-05-05
  • SpringMVC @RequestBody的使用解析

    SpringMVC @RequestBody的使用解析

    這篇文章主要介紹了SpringMVC @RequestBody的使用解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • SpringBoot中關(guān)于static和templates的注意事項(xiàng)以及webjars的配置

    SpringBoot中關(guān)于static和templates的注意事項(xiàng)以及webjars的配置

    今天小編就為大家分享一篇關(guān)于SpringBoot中關(guān)于static和templates的注意事項(xiàng)以及webjars的配置,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-01-01
  • Java生成隨機(jī)時(shí)間的簡(jiǎn)單隨機(jī)算法

    Java生成隨機(jī)時(shí)間的簡(jiǎn)單隨機(jī)算法

    今天小編就為大家分享一篇關(guān)于Java生成隨機(jī)時(shí)間的簡(jiǎn)單隨機(jī)算法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-01-01
  • Java實(shí)現(xiàn)線程同步方法及原理詳解

    Java實(shí)現(xiàn)線程同步方法及原理詳解

    這篇文章主要介紹了Java實(shí)現(xiàn)線程同步方法及原理詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • springboot無(wú)法從靜態(tài)上下文中引用非靜態(tài)變量的解決方法

    springboot無(wú)法從靜態(tài)上下文中引用非靜態(tài)變量的解決方法

    這篇文章主要介紹了springboot無(wú)法從靜態(tài)上下文中引用非靜態(tài)變量的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-06-06
  • 解決IDEA光標(biāo)變成白色粗條的問(wèn)題

    解決IDEA光標(biāo)變成白色粗條的問(wèn)題

    這篇文章主要介紹了解決IDEA光標(biāo)變成白色粗條的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • java代碼mqtt接收發(fā)送消息方式

    java代碼mqtt接收發(fā)送消息方式

    這篇文章主要介紹了java代碼mqtt接收發(fā)送消息方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 使用Jenkins配置Git+Maven的自動(dòng)化構(gòu)建的方法

    使用Jenkins配置Git+Maven的自動(dòng)化構(gòu)建的方法

    這篇文章主要介紹了使用Jenkins配置Git+Maven的自動(dòng)化構(gòu)建的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01

最新評(píng)論