亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時(shí)間:2021年03月05日 09:04:08   作者:Mr_ηobody  
這篇文章主要介紹了如何手寫一個(gè)Spring Boot Starter,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下

何為 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í)際工作中,開(kāi)發(fā)出自己的 Starter,提高我們的開(kāi)發(fā)效率。

可能有人會(huì)問(wèn) Starter 能干嘛呢?其實(shí)在我們的日常開(kāi)發(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è)功能:

  1. 根據(jù)用戶提供的 Java 對(duì)象,將其轉(zhuǎn)換為 JSON 形式,并且在 JSON 字符串中添加指定的前輟和后輟。
  2. 用戶可以動(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使用者沒(méi)在配置文件中配置prefixName屬性的值時(shí)的默認(rèn)值
 public static final String DEFAULT_PREFIX_NAME = "@";

 // Starter使用者沒(méi)在配置文件中配置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) // 激活@ConfigurationProperties
public 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)容器沒(méi)有此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)如下:

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

使用自定義的 Starter

經(jīng)過(guò)上面幾個(gè)步驟,我們自定義的 Starter 就開(kāi)發(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ù)中看到此依賴了。

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

然后在需要用到的類中進(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)目,在瀏覽器中訪問(wèn)此接口,得到如下結(jié)果:

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

nobody: 
 json:
 prefixName: HH
 suffixName: KK

當(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)容器沒(méi)有此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)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • idea中l(wèi)ombok啟用的方法示例

    idea中l(wèi)ombok啟用的方法示例

    這篇文章主要介紹了idea中l(wèi)ombok啟用的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Java 使用JdbcTemplate 中的queryForList發(fā)生錯(cuò)誤解決辦法

    Java 使用JdbcTemplate 中的queryForList發(fā)生錯(cuò)誤解決辦法

    這篇文章主要介紹了Java 使用JdbcTemplate 中的queryForList發(fā)生錯(cuò)誤解決辦法的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • JAVA多線程之中斷機(jī)制stop()、interrupted()、isInterrupted()

    JAVA多線程之中斷機(jī)制stop()、interrupted()、isInterrupted()

    這篇文章主要介紹了JAVA多線程之中斷機(jī)制stop()、interrupted()、isInterrupted()的相關(guān)資料,需要的朋友可以參考下
    2016-05-05
  • Spring實(shí)現(xiàn)IoC和DI的方法詳解

    Spring實(shí)現(xiàn)IoC和DI的方法詳解

    IoC全稱Inversion of Control (控制反轉(zhuǎn)) ,這里的控制其實(shí)是控制權(quán)的意思,可以理解為對(duì)象的獲取權(quán)力和方式發(fā)生了發(fā)轉(zhuǎn),DI依賴注?是?個(gè)過(guò)程,是指IoC容器在創(chuàng)建Bean時(shí), 去提供運(yùn)?時(shí)所依賴的資源,?資源指的就是對(duì)象,本文介紹了Spring實(shí)現(xiàn)IoC和DI的方法
    2024-08-08
  • IDEA中scala生成變量后自動(dòng)顯示變量類型問(wèn)題

    IDEA中scala生成變量后自動(dòng)顯示變量類型問(wèn)題

    這篇文章主要介紹了IDEA中scala生成變量后自動(dòng)顯示變量類型問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Java 判斷兩個(gè)字符串是否由相同的字符組成的實(shí)例

    Java 判斷兩個(gè)字符串是否由相同的字符組成的實(shí)例

    今天小編就為大家分享一篇Java 判斷兩個(gè)字符串是否由相同的字符組成的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • 使用itextpdf操作pdf的實(shí)例講解

    使用itextpdf操作pdf的實(shí)例講解

    下面小編就為大家分享一篇使用itextpdf操作pdf的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • Rabbitmq延遲隊(duì)列實(shí)現(xiàn)定時(shí)任務(wù)的方法

    Rabbitmq延遲隊(duì)列實(shí)現(xiàn)定時(shí)任務(wù)的方法

    這篇文章主要介紹了Rabbitmq延遲隊(duì)列實(shí)現(xiàn)定時(shí)任務(wù),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • 基于springboot實(shí)現(xiàn)數(shù)據(jù)可視化的示例代碼

    基于springboot實(shí)現(xiàn)數(shù)據(jù)可視化的示例代碼

    本文主要介紹了基于springboot實(shí)現(xiàn)數(shù)據(jù)可視化,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧<BR>
    2022-07-07
  • Spring中的攔截器HandlerInterceptor詳細(xì)解析

    Spring中的攔截器HandlerInterceptor詳細(xì)解析

    這篇文章主要介紹了Spring中的攔截器HandlerInterceptor詳細(xì)解析,HandlerInterceptor 是 Spring 框架提供的一個(gè)攔截器接口,用于在請(qǐng)求處理過(guò)程中攔截和處理請(qǐng)求,需要的朋友可以參考下
    2024-01-01

最新評(píng)論