国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術(shù)文章
文章詳情頁

如何手寫一個(gè)Spring Boot Starter

瀏覽:121日期:2023-07-20 14:43:52
何為 Starter ?

想必大家都使用過 SpringBoot,在 SpringBoot 項(xiàng)目中,使用最多的無非就是各種各樣的 Starter 了。那何為 Starter 呢?你可以理解為一個(gè)可拔插式的插件(組件)。或者理解為場(chǎng)景啟動(dòng)器。

通過 Starter,能夠簡(jiǎn)化以前繁雜的配置,無需過多的配置和依賴,它會(huì)幫你合并依賴,并且將其統(tǒng)一集成到一個(gè) Starter 中,我們只需在 Maven 或 Gradle 中引入 Starter 依賴即可。SpringBoot 會(huì)自動(dòng)掃描需要加載的信息并啟動(dòng)相應(yīng)的默認(rèn)配置。例如,如果你想使用 jdbc 插件,你只需引入 spring-boot-starter-jdbc 即可;如果你想使用 mongodb,你只需引入 spring-boot-starter-data-mongodb 依賴即可。

SpringBoot 官方提供了大量日常企業(yè)應(yīng)用研發(fā)各種場(chǎng)景的 spring-boot-starter 依賴模塊。這些依賴模塊都遵循著約定成俗的默認(rèn)配置,并允許我們根據(jù)自身情況調(diào)整這些配置。

總而言之,Starter 提供了以下功能:

整合了模塊需要的所有依賴,統(tǒng)一集合到 Starter 中。 提供了默認(rèn)配置,并允許我們調(diào)整這些默認(rèn)配置。 提供了自動(dòng)配置類對(duì)模塊內(nèi)的 Bean 進(jìn)行自動(dòng)裝配,注入 Spring 容器中。 Starter 命名規(guī)則

Spring 官方定義的 Starter 通常命名遵循的格式為 spring-boot-starter-{name},例如 spring-boot-starter-data-mongodb。Spring 官方建議,非官方 Starter 命名應(yīng)遵循 {name}-spring-boot-starter 的格式,例如,myjson-spring-boot-starter。

自定義一個(gè) Starter

了解了 Starter 的含義以及應(yīng)用場(chǎng)景后,我們可以嘗試手寫一個(gè) Starter,加深對(duì)它的了解以及能在實(shí)際工作中,開發(fā)出自己的 Starter,提高我們的開發(fā)效率。

可能有人會(huì)問 Starter 能干嘛呢?其實(shí)在我們的日常開發(fā)工作中,總有一些獨(dú)立于業(yè)務(wù)系統(tǒng)之外的配置模塊,它是可以在不同項(xiàng)目中進(jìn)行復(fù)用的。如果在每個(gè)項(xiàng)目中都編寫重復(fù)的模塊代碼,不僅浪費(fèi)時(shí)間和人力,而且還和項(xiàng)目耦合。所以我們將這些可獨(dú)立于業(yè)務(wù)代碼之外的功能配置模塊封裝成一個(gè) Starter,在需要用到此功能模塊的項(xiàng)目中,只需要在其 pom.xml 文件中引用依賴即可,SpringBoot 幫我們完成自動(dòng)裝配,而且我們還可以在配置文件中調(diào)整 Starter 中默認(rèn)的配置信息。

假設(shè)我們現(xiàn)在需要實(shí)現(xiàn)這樣一個(gè)功能:

根據(jù)用戶提供的 Java 對(duì)象,將其轉(zhuǎn)換為 JSON 形式,并且在 JSON 字符串中添加指定的前輟和后輟。 用戶可以動(dòng)態(tài)改變前輟和后輟,即可在 yml 或 properties 配置文件中自定義。

舉個(gè)栗子,假如用戶輸入下面這個(gè)類的對(duì)象 person:

public class Person { private String name; private int age; private String address; public Person(String name, int age, String address) { super(); this.name = name; this.age = age; this.address = address; } // 省略get和set方法}

Person person = new Person('Mr.nobody', 18, '拉斯維加斯');

并假設(shè)用戶在 application.yml 配置文件中配置的前輟為 @,后輟為 %,則最終生成的字符串為:

@{'address':'拉斯維加斯','age':18,'name':'Mr.nobody'}%

首先新建一個(gè) Maven 工程(當(dāng)然也可以其他類型例如 Gradle 工程),在 pom.xml 文件中引入如下依賴。fastjson 依賴是我們業(yè)務(wù)用到將 Java 對(duì)象轉(zhuǎn)換為 JSON 字符串;spring-boot-configuration-processor 依賴是可選的,加入此依賴主要是打包時(shí),自動(dòng)生成配置元信息文件 META-INF/spring-configuration-metadata.json,并放入到 jar 中。方便使用者了解到一些配置元信息。

<?xml version='1.0' encoding='UTF-8'?><project xmlns='http://maven.apache.org/POM/4.0.0' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'xsi:schemaLocation='http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd'><modelVersion>4.0.0</modelVersion><groupId>com.nobody</groupId><artifactId>myjson-spring-boot-starter</artifactId><version>0.0.1-SNAPSHOT</version><name>myjson-spring-boot-starter</name><description>Demo project for Spring Boot Starter</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><version>2.3.8.RELEASE</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><version>2.3.8.RELEASE</version><optional>true</optional></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.73</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId><version>2.3.8.RELEASE</version></dependency></dependencies></project>

業(yè)務(wù)處理類,實(shí)現(xiàn) Java 對(duì)象轉(zhuǎn)換為帶有指定前后綴的 JSON 字符串。

package com.nobody.myjson.service;import com.alibaba.fastjson.JSON;/** * @Description 業(yè)務(wù)處理類 * @Author Mr.nobody * @Date 2021/2/27 * @Version 1.0 */public class MyJsonService { // 前綴 private String prefixName; // 后綴 private String suffixName; /** * 將Java對(duì)象轉(zhuǎn)為帶有指定前后綴的JSON字符串 * * @param o 需要轉(zhuǎn)換的Java對(duì)象 * @return 轉(zhuǎn)換后的字符串 */ public String objectToMyJson(Object o) { return prefixName + JSON.toJSONString(o) + suffixName; } public String getPrefixName() { return prefixName; } public void setPrefixName(String prefixName) { this.prefixName = prefixName; } public String getSuffixName() { return suffixName; } public void setSuffixName(String suffixName) { this.suffixName = suffixName; }}配置類,定義需要的配置信息和默認(rèn)配置項(xiàng),并指明關(guān)聯(lián)配置文件的配置項(xiàng)前綴。它可以把相同前綴的配置信息通過配置項(xiàng)名稱映射成實(shí)體類的屬性中。package com.nobody.myjson.config;import org.springframework.boot.context.properties.ConfigurationProperties;/** * @Description 配置類(類名一般為模塊名+Properties) nobody.json為Starter使用者通過yml配置文件動(dòng)態(tài)修改屬性值的變量名前綴 * @Author Mr.nobody * @Date 2021/2/27 * @Version 1.0 */@ConfigurationProperties(prefix = 'nobody.json')public class MyJsonProperties { // Starter使用者沒在配置文件中配置prefixName屬性的值時(shí)的默認(rèn)值 public static final String DEFAULT_PREFIX_NAME = '@'; // Starter使用者沒在配置文件中配置suffixName屬性的值時(shí)的默認(rèn)值 public static final String DEFAULT_SUFFIX_NAME = '@'; private String prefixName = DEFAULT_PREFIX_NAME; private String suffixName = DEFAULT_SUFFIX_NAME; public String getPrefixName() { return prefixName; } public void setPrefixName(String prefixName) { this.prefixName = prefixName; } public String getSuffixName() { return suffixName; } public void setSuffixName(String suffixName) { this.suffixName = suffixName; }}

自動(dòng)裝配類,使用 @Configuration 和 @Bean 來進(jìn)行自動(dòng)裝配,注入 Spring 容器中。

package com.nobody.myjson.config;import com.nobody.myjson.service.MyJsonService;import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;import org.springframework.boot.context.properties.EnableConfigurationProperties;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;/** * @Description 自動(dòng)裝配類 * @Author Mr.nobody * @Date 2021/2/27 * @Version 1.0 */@Configuration // 標(biāo)識(shí)此類是配置類@ConditionalOnClass(MyJsonService.class) // 表示只有指定的class在classpath上時(shí)才能被注冊(cè)@EnableConfigurationProperties(MyJsonProperties.class) // 激活@ConfigurationPropertiespublic class MyJsonConfiguration { private MyJsonProperties myJsonProperties; // 自動(dòng)注入配置類 public MyJsonConfiguration(MyJsonProperties myJsonProperties) { this.myJsonProperties = myJsonProperties; } // 創(chuàng)建MyJsonService對(duì)象,注入到Spring容器中 @Bean @ConditionalOnMissingBean(MyJsonService.class) // 當(dāng)容器沒有此bean時(shí),才注冊(cè) public MyJsonService myJsonService() { MyJsonService myJsonService = new MyJsonService(); myJsonService.setPrefixName(myJsonProperties.getPrefixName()); myJsonService.setSuffixName(myJsonProperties.getSuffixName()); return myJsonService; }}

在 src/main/resources/META-INF目錄下新建 spring.factories 文件,輸入以下內(nèi)容:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.nobody.myjson.config.MyJsonConfiguration

SpringBoot 項(xiàng)目啟動(dòng)時(shí),類加載器會(huì)從 META-INF / spring.factories 加載給定類型的工廠實(shí)現(xiàn)的完全限定類名。也就是說類加載器得到工程中所有 jar 包中的 META-INF/spring.factories 文件資源,從而得到了一些包括自動(dòng)配置相關(guān)的類的集合,然后將它們實(shí)例化,放入 Spring 容器中。

最終項(xiàng)目結(jié)構(gòu)如下:

如何手寫一個(gè)Spring Boot Starter

在開發(fā)工具 IDEA 通過 Maven 的 install 命令進(jìn)行構(gòu)建打包。或者在項(xiàng)目的目錄下,打開命令行窗口,使用mvn install命令進(jìn)行構(gòu)建打包。打包后,會(huì)在工程的 target 目錄下生成一個(gè) jar 包,并且在 maven 本地倉庫也會(huì)生成相應(yīng)的 jar 包。

如何手寫一個(gè)Spring Boot Starter

如何手寫一個(gè)Spring Boot Starter

如何手寫一個(gè)Spring Boot Starter

如何手寫一個(gè)Spring Boot Starter

使用自定義的 Starter

經(jīng)過上面幾個(gè)步驟,我們自定義的 Starter 就開發(fā)好了,以下是在其他工程進(jìn)行引入使用。在需要引用此 Starter 的工程的 pom.xml 文件中引入此依賴。

<dependency> <groupId>com.nobody</groupId> <artifactId>myjson-spring-boot-starter</artifactId> <version>0.0.1-SNAPSHOT</version></dependency>

刷新依賴,就能在項(xiàng)目的依賴庫中看到此依賴了。

如何手寫一個(gè)Spring Boot Starter

展開,還能查看此 Starter 可以配置的屬性項(xiàng)有哪些,如下:

如何手寫一個(gè)Spring Boot Starter

然后在需要用到的類中進(jìn)行注入使用即可。

package com.nobody.controller;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import com.nobody.domain.Person;import com.nobody.service.MyJsonService;@RestController@RequestMapping('demo')public class DemoController { // 注入我們Starter中的服務(wù)類 @Autowired private MyJsonService myJsonService; @GetMapping() public String test() { Person p = new Person('Mr.nobody', 18, '拉斯維加斯'); // 調(diào)用服務(wù)方法 return myJsonService.objectToMyJson(p); }}

啟動(dòng)項(xiàng)目,在瀏覽器中訪問此接口,得到如下結(jié)果:

如何手寫一個(gè)Spring Boot Starter

如果我們?cè)?application.yml 文件中添加以下配置信息,然后再訪問接口的結(jié)果如下,也驗(yàn)證了我們可以自定義 Starter 中默認(rèn)的配置項(xiàng)。

nobody: json: prefixName: HH suffixName: KK

如何手寫一個(gè)Spring Boot Starter

當(dāng)我們引入此 Starter 時(shí),SpringBoot 會(huì)自動(dòng)裝配,將實(shí)例化的 bean 放入 Spring 容器。但我們是否可控制 bean 要不要實(shí)例化并放入容器呢?答案是可以做到的。

我們只需要在自動(dòng)裝配類或者類內(nèi)的方法,通過 @ConditionalOnXXX 注解就能控制。例如如下所示,使用 Starter 使用者在他的項(xiàng)目的配置文件中填寫 nobody.json.enable 的值為 false,則就不會(huì)自動(dòng)生成 MyJsonService 實(shí)例了。默認(rèn)不填或者 nobody.json.enable 的值為 true 時(shí),能自動(dòng)生成 bean 放入容器。這樣用戶就能自己控制 bean 的實(shí)例化了。

// 創(chuàng)建MyJsonService對(duì)象,注入到Spring容器中@Bean@ConditionalOnProperty(name = 'nobody.json.enable', matchIfMissing = true)@ConditionalOnMissingBean(MyJsonService.class) // 當(dāng)容器沒有此bean時(shí),才注冊(cè)public MyJsonService myJsonService() { MyJsonService myJsonService = new MyJsonService(); myJsonService.setPrefixName(myJsonProperties.getPrefixName()); myJsonService.setSuffixName(myJsonProperties.getSuffixName()); return myJsonService;}

此演示項(xiàng)目已上傳到Github,如有需要可自行下載,歡迎 Star 。

https://github.com/LucioChn/myjson-spring-boot-starter

以上就是如何手寫一個(gè)Spring Boot Starter的詳細(xì)內(nèi)容,更多關(guān)于手寫Spring Boot Starter的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 中文字幕一区二区三区在线观看 | 极品的亚洲 | 久久免费播放 | 欧美另类在线观看 | 国内美女福利视频在线观看网站 | 欧美特黄视频在线观看 | 日韩精品中文字幕一区二区三区 | 亚洲人的天堂男人爽爽爽 | 成人毛片18女人毛片免费 | 亚洲第一在线播放 | 精品无码久久久久国产 | 亚洲男女视频 | 91精品日本久久久久久牛牛 | 国产免费v片在线看 | 国产伦久视频免费观看视频 | 日韩久久网 | 99视频在线观看视频 | 欧美一级片免费观看 | 久久亚洲精品一区成人 | 成人高清视频免费观看 | 我要看一级大片 | 亚洲国产精品线在线观看 | 成人看的午夜免费毛片 | 亚洲欧美大片 | 欧美一区二区在线 | 婷婷久久久五月综合色 | 欧美日韩一区二区三区视频 | 欧美精品一区二区三区免费播放 | 久久久国产精品福利免费 | 天堂影院jav成人天堂免费观看 | 老司机精品福利视频 | 手机看片1024欧美日韩你懂的 | 国产成人a福利在线观看 | 特级毛片a级毛免费播放 | 欧美精品xx | 国产成人毛片毛片久久网 | 在线视频一区二区日韩国产 | 在线永久免费观看黄网站 | 亚洲精品久久99久久一区 | 韩国一区在线 | 国产成人精品免费视频大全办公室 |