日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

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

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

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

通過(guò) Starter,能夠簡(jiǎn)化以前繁雜的配置,無(wú)需過(guò)多的配置和依賴,它會(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)前綴。它可以把相同前綴的配置信息通過(guò)配置項(xiàng)名稱映射成實(shí)體類的屬性中。package com.nobody.myjson.config;import org.springframework.boot.context.properties.ConfigurationProperties;/** * @Description 配置類(類名一般為模塊名+Properties) nobody.json為Starter使用者通過(guò)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 來(lái)進(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)的完全限定類名。也就是說(shuō)類加載器得到工程中所有 jar 包中的 META-INF/spring.factories 文件資源,從而得到了一些包括自動(dòng)配置相關(guān)的類的集合,然后將它們實(shí)例化,放入 Spring 容器中。

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

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

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

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

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

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

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

使用自定義的 Starter

經(jīng)過(guò)上面幾個(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)目的依賴庫(kù)中看到此依賴了。

如何手寫一個(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)的方法,通過(guò) @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)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
美国三级日本三级久久99| 欧美va天堂在线| 午夜在线精品偷拍| 狠狠干成人综合网| 久久亚洲风情| 亚洲精品日本| 国产欧美高清视频在线| 国语精品一区| 免费污视频在线一区| 99久久精品国产亚洲精品| 久久国产影院| 欧美日韩国产高清| 久热综合在线亚洲精品| 国产探花一区在线观看| 国产日韩在线观看视频| 水蜜桃精品av一区二区| 91偷拍一区二区三区精品| 日韩精品看片| 免费成人性网站| 久久99精品久久久野外观看| 国产成人久久精品一区二区三区| 91超碰国产精品| 日韩专区视频网站| 久久99偷拍| 自拍日韩欧美| 鲁大师精品99久久久| 免费国产自久久久久三四区久久| 亚洲一区二区免费看| 久久99偷拍| 九一成人免费视频| 国产精品一线天粉嫩av| 精品日产乱码久久久久久仙踪林| re久久精品视频| 麻豆一区二区在线| 在线免费观看亚洲| www成人在线视频| 国产精品va视频| 亚洲免费婷婷| 亚洲播播91| 麻豆精品国产91久久久久久| 午夜电影一区| 夜夜精品视频| 999国产精品999久久久久久| 91亚洲精品视频在线观看| 亚洲成人一区| 日韩欧美午夜| 欧美在线黄色| 丝袜美腿一区二区三区| 99成人在线视频| 久久久久久一区二区| 国产欧美啪啪| 国产欧美啪啪| 国产精品一区二区三区美女| 日韩中文字幕无砖| 天堂va蜜桃一区二区三区| 欧美在线网站| 91久久久久| 91精品国产自产在线观看永久∴| 麻豆成人综合网| 国产一区二区三区亚洲| 精品美女在线视频| 国产精品香蕉| 久久不卡国产精品一区二区| 国产精品免费大片| 国产三级精品三级在线观看国产| 日韩国产在线不卡视频| 97精品久久| 鲁大师精品99久久久| 国产一区二区三区四区大秀| 国产自产自拍视频在线观看| 福利一区二区三区视频在线观看| 国产精品国产三级国产在线观看| 精品资源在线| 久久久男人天堂| 88xx成人免费观看视频库| 久久激情一区| 欧美日韩在线网站| 亚洲欧美日韩在线观看a三区| 久久av在线| 久久国产欧美日韩精品| 久久精品国产久精国产爱| 九九色在线视频| 久久国产99| 国产精品一区二区三区美女 | 伊人久久亚洲美女图片| 亚洲欧洲日韩| 超碰99在线| 久久成人精品| 国产成人免费视频网站视频社区| 国内精品福利| 久久国产尿小便嘘嘘| av一区在线| 欧美永久精品| 久久亚洲成人| 国产精品黄色| 欧美网站在线| 精品网站999| 噜噜噜躁狠狠躁狠狠精品视频 | 日韩精品一区二区三区中文在线| 国产免费av国片精品草莓男男| 99视频精品全国免费| 天海翼亚洲一区二区三区| 超碰99在线| 欧美精品第一区| 丝袜美腿亚洲一区二区图片| 激情久久99| 亚洲精品美女91| 美女少妇全过程你懂的久久| 欧美国产免费| 亚洲啊v在线免费视频| 国产专区一区| 国产一区二区三区四区二区| 亚洲精品成人一区| 日韩成人a**站| 国产精品成人**免费视频| 国产精品视区| 欧美特黄a级高清免费大片a级| 精品伊人久久| 日韩高清一区二区| 亚洲一区二区毛片| 欧美日韩中文字幕一区二区三区| 久久精品国产网站| 国产色99精品9i| 日韩精品免费视频人成| 日韩视频一区二区三区在线播放免费观看 | 爽好久久久欧美精品| 成人在线观看免费视频| 麻豆精品av| 成人国产精品一区二区免费麻豆| 久久wwww| 高清精品久久| 日韩免费福利视频| 久久久噜噜噜| 今天的高清视频免费播放成人| 国产尤物精品| 视频一区欧美日韩| 亚洲毛片一区| 免费在线亚洲欧美| 中文字幕在线看片| 亚洲91精品| 欧美精品一二| 免费中文字幕日韩欧美| 日韩精品一区二区三区中文字幕| 日韩av三区| 日本精品黄色| 亚洲二区三区不卡| 只有精品亚洲| 国产精品最新| 久久毛片亚洲| 好吊视频一区二区三区四区| 日本久久二区| 日韩一区三区| 亚洲精品激情| 久久精品免视看国产成人| 天堂av在线| 欧美日韩国产欧| 欧美在线看片| 久久一级电影| 91免费精品国偷自产在线在线| 国产精品久久久久久久免费观看| 亚洲韩日在线| 日本午夜免费一区二区| 亚洲欧洲美洲av| 日韩欧美中文在线观看| 亚洲美女久久精品| 91亚洲精品在看在线观看高清| 亚洲成人二区| 精品视频一区二区三区四区五区| 亚洲www啪成人一区二区| 蜜臀久久99精品久久久久宅男| 国产欧美日韩一级| 亚洲韩日在线| 麻豆视频在线观看免费网站黄 | 亚洲精品一二| 久久婷婷亚洲| 精品国产精品国产偷麻豆| 亚洲欧美日韩国产一区二区| 日韩大片在线观看| 国产精品一国产精品k频道56| jiujiure精品视频播放| 国产亚洲一区二区手机在线观看 | 欧美日一区二区在线观看| 亚洲大全视频| 久久精选视频| 久久精品导航| 97人人精品| 精品三级国产| 麻豆国产欧美日韩综合精品二区| 丝袜美腿高跟呻吟高潮一区| 五月天久久777| 激情欧美丁香| 不卡一区综合视频| 久久三级视频| 日韩一区欧美| 日韩精品免费一区二区在线观看| 伊人久久av| 婷婷激情久久| 亚洲综合欧美| 亚洲尤物av| 91成人在线精品视频|