日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

如何自定义starter

發(fā)布時間:2023/12/20 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何自定义starter 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

背景

使用過Spring Boot的小伙伴都應該知道,一個Spring Boot 項目就是由一個一個 starter 組成的,一個 starter 代表該項目的 Spring Boot 啟動依賴,除了官方已有的 starter,我們可以根據(jù)自己的需要自定義新的starter。

我們經(jīng)常會看到或者使用到各種***-starter。比如下面幾種:

  • spring-boot-starter-web:嵌入Tomcat和web開發(fā)需要的相關(guān)jar包

  • spring-boot-starter-data-redis:redis數(shù)據(jù)庫支持

  • mybatis-spring-boot-starter:第三方的mybatis集成的starter

  • spring-boot -starter-test:用于測試 Spring 引導應用程序

  • spring-boot-starter-AOP :這個 starter 用于使用 AspectJ 和 Spring AOP 進行面向方面的編程

  • starter有何用呢?

    在我們的日常開發(fā)工作中,經(jīng)常會有一些獨立于業(yè)務之外的配置模塊,我們經(jīng)常將其放到一個特定的包下,然后如果另一個工程需要復用這塊功能的時候,需要將代碼硬拷貝到另一個工程,重新集成一遍,麻煩至極。如果我們將這些可獨立于業(yè)務代碼之外的功配置模塊封裝成一個個starter,復用的時候只需要將其在pom中引用依賴即可,Spring Boot為我們完成自動裝配,簡直不要太爽。

    比如我們之前做MVC時要引入日志組件,那么需要去找到log4j的版本,然后引入,現(xiàn)在有了Starter之后,直接用這個之后,log4j就自動引入了,也不用關(guān)心版本這些問題。

    比如我們要在Spring Boot中引入Web MVC的支持時,我們通常會引入這個模塊spring-boot-starter-web,而這個模塊如果解壓包出來會發(fā)現(xiàn)里面什么都沒有,只定義了一些POM依賴。

    Spring Boot starter機制

      Spring Boot中的starter是一種非常重要的機制,能夠拋棄以前繁雜的配置,將其統(tǒng)一集成進starter,應用者只需要在maven中引入starter依賴,Spring Boot就能自動掃描到要加載的信息并啟動相應的默認配置。starter讓我們擺脫了各種依賴庫的處理,需要配置各種信息的困擾。Spring Boot會自動通過classpath路徑下的類發(fā)現(xiàn)需要的Bean,并注冊進IOC容器。Spring Boot提供了針對日常企業(yè)應用研發(fā)各種場景的spring-boot-starter依賴模塊。所有這些依賴模塊都遵循著約定成俗的默認配置,并允許我們調(diào)整這些配置,即遵循“約定大于配置”的理念。

    自定義starter的條件

    如果想自定義Starter,首選需要實現(xiàn)自動化配置,而要實現(xiàn)自動化配置需要滿足以下兩個條件:? ?

  • 能夠自動配置項目所需要的配置信息,也就是自動加載依賴環(huán)境;? ? ? ? ?

  • 能夠根據(jù)項目提供的信息自動生成Bean,并且注冊到Bean管理容器中;

  • 自定義starter代碼部分

    pom.xml依賴

    <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId><version>2.0.0.RELEASE</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><version>2.0.0.RELEASE</version><optional>true</optional></dependency> </dependencies>

    根據(jù)需要自定義Starter的實現(xiàn)過程大致如下(以我定義的Starter為例):

    定義XxxProperties類,屬性配置類,完成屬性配置相關(guān)的操作,比如設(shè)置屬性前綴,用于在application.properties中配置。

    TianProperties代碼:

    import org.springframework.boot.context.properties.ConfigurationProperties; @ConfigurationProperties(prefix = "spring.tian") public class TianProperties {// 姓名private String name;// 年齡private int age;// 性別private String sex = "M";//get and set }

    創(chuàng)建XxxService類,完成相關(guān)的操作邏輯 。

    TianService代碼:

    public class TianService {private TianProperties properties;public TianService() {}public TianService(TianProperties userProperties) {this.properties = userProperties;}public void sayHello(){System.out.println("hi, 我叫: " + properties.getName() +", 今年" + properties.getAge() + "歲"+ ", 性別: " + properties.getSex());} }

    定義XxxConfigurationProperties類,自動配置類,用于完成Bean創(chuàng)建等工作。

    TianServiceAutoConfiguration代碼:

    @Configuration @EnableConfigurationProperties(TianProperties.class) @ConditionalOnClass(TianService.class) @ConditionalOnProperty(prefix = "spring.tian", value = "enabled", matchIfMissing = true) public class TianServiceAutoConfiguration {@Autowiredprivate TianProperties properties;@Bean@ConditionalOnMissingBean(TianService.class)public TianService tianService() {return new TianService(properties);} }

    在resources下創(chuàng)建目錄META-INF,在 META-INF 目錄下創(chuàng)建 spring.factories,在SpringBoot啟動時會根據(jù)此文件來加載項目的自動化配置類。

    spring.factories中配置

    org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.tian.TianServiceAutoConfiguration

    把上面這個starter工程打成jar包

    項目中使用自定義starter

    創(chuàng)建一個Spring Boot項目test

    在項目中把自定義starter添加pom依賴

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

    TestApplication啟動類

    @SpringBootApplication @EnableEurekaServer public class TestApplication {public static void main(String[] args) {SpringApplication.run(TestApplication.class, args);} }

    application.properties中配置

    spring.tian.name=tian spring.tian.age=22 spring.tian.sex=M

    寫一個TestController.java類

    RestController @RequestMapping("/my") public class TestController {@Resourceprivate TianService tianService;@PostMapping("/starter")public Object starter() {tianService.sayHello();return "ok";} }

    jar以來進來后,可以看到

    多了一個json的文件

    最后啟動項目,輸入

    http://localhost:9091/my/starter

    后臺打印

    hi, 我叫: tian, 今年22歲, 性別: M

    這就成功的現(xiàn)實了自定義的starter。

    總結(jié)

  • Spring Boot在啟動時掃描項目所依賴的JAR包,尋找包含spring.factories文件的JAR包,

  • 然后讀取spring.factories文件獲取配置的自動配置類AutoConfiguration,

  • 然后將自動配置類下滿足條件(@ConditionalOnXxx)的@Bean放入到Spring容器中(Spring Context)

  • 這樣使用者就可以直接用來注入,因為該類已經(jīng)在容器中了

  • 推薦閱讀

    Spring Boot系列文章匯總,值得收藏!!!

    往期好文,篇篇都有精彩~

    總結(jié)

    以上是生活随笔為你收集整理的如何自定义starter的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。