日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
手寫(xiě)自定義SpringBoot-Starter,感受框架的魅力和原理

一、前言

Springboot的自動(dòng)配置原理,面試中經(jīng)常問(wèn)到,一直看也記不住,不如手寫(xiě)一個(gè)starter,加深一下記憶??戳酥蟀l(fā)現(xiàn)大部分的starter都是這個(gè)原理,實(shí)踐才會(huì)記憶深刻。核心思想:約定大于配置。

創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司提供網(wǎng)站設(shè)計(jì)和自適應(yīng)建站服務(wù)。團(tuán)隊(duì)由有經(jīng)驗(yàn)的網(wǎng)頁(yè)設(shè)計(jì)師、程序員和市場(chǎng)專(zhuān)家組成,能夠提供從H5建站,網(wǎng)站制作,一元廣告,模板建站到成都小程序開(kāi)發(fā)等全方位服務(wù)。 以客戶為中心,致力于為客戶提供創(chuàng)新、高效的解決方案,幫助您打造成功的企業(yè)網(wǎng)站。

二、初探starter啟動(dòng)原理

我們直接看看官網(wǎng)的starter是怎么設(shè)計(jì)的,仿照這寫(xiě)一個(gè)就行了!

我們Ctrl點(diǎn)擊spring-boot-starter-web,進(jìn)入內(nèi)部pom,我們發(fā)現(xiàn)里面有個(gè)。


org.springframework.boot
spring-boot-starter
2.5.3
compile

在此Ctrl點(diǎn)擊spring-boot-starter進(jìn)入starter內(nèi)部pom:我們發(fā)現(xiàn)之后干活的就是這個(gè)包依賴:


org.springframework.boot
spring-boot-autoconfigure
2.5.3
compile

我們現(xiàn)在創(chuàng)建兩個(gè)項(xiàng)目即可:

  • spring-boot-starter(啟動(dòng)器)
  • spring-boot-starter-autoconfigure(自動(dòng)配置包)

小編看到官方這么寫(xiě)的提醒,大家可以按照官網(wǎng)的進(jìn)行起名稱,不要學(xué)小編哈!!

您應(yīng)該確保為您的啟動(dòng)器提供適當(dāng)?shù)拿臻g。不要以 . 開(kāi)頭的模塊名稱spring-boot,即使您使用不同的 Maven groupId。我們將來(lái)可能會(huì)為您自動(dòng)配置的內(nèi)容提供官方支持。
根據(jù)經(jīng)驗(yàn),您應(yīng)該在啟動(dòng)器之后命名組合模塊。例如,假設(shè)您正在為“acme”創(chuàng)建一個(gè)啟動(dòng)器,并且您命名自動(dòng)配置模塊acme-spring-boot和啟動(dòng)器acme-spring-boot-starter。如果您只有一個(gè)模塊將兩者結(jié)合起來(lái),請(qǐng)將其命名為acme-spring-boot-starter.

三、項(xiàng)目搭建

1、新建空白項(xiàng)目

輸入總的項(xiàng)目名稱:

在空白項(xiàng)目里新建兩個(gè),這里可以分開(kāi)單獨(dú)建立,這里小編跟著雷神一樣了,就不單獨(dú)建立項(xiàng)目了!

2、新建maven項(xiàng)目

包名和名稱:

3、新建springboot項(xiàng)目

4、項(xiàng)目架構(gòu)

這里把沒(méi)有用的都刪除了??!可以不刪。

四、配置

1、在starter項(xiàng)目中引入自己的autoconfigure依賴

就是上面建立項(xiàng)目的設(shè)置的。



com.wang
spring-boot-autoconfigure
0.0.1-SNAPSHOT

2、spring-boot-autoconfigure pom配置


1.8
UTF-8
UTF-8
2.3.7.RELEASE




org.springframework.boot
spring-boot-starter
${spring-boot.version}


org.projectlombok
lombok
1.18.24

還是把沒(méi)用的東西刪除了,剩余如下圖:

五、編寫(xiě)autoconfigure項(xiàng)目

1、配置一個(gè)bean

首先刪除了自動(dòng)啟動(dòng)類(lèi),咱們用不到,在spring-boot-autoconfigure項(xiàng)目中新建一個(gè)bean,此時(shí)不需要讓這個(gè)bean在容器中,我們寫(xiě)一個(gè)自己配置,讓他自動(dòng)加入到容器中。
這就是自動(dòng)配置的思想。

/**
* 這里不需要讓在容器中,我們寫(xiě)一個(gè)自己配置,讓他自動(dòng)加入到容器中
* @author wangzhenjun
* @date 2022/10/14 16:26
*/
public class HelloService {

@Autowired
private MyProperties myProperties;

public String HelloWord (String username){
return myProperties.getPrefix() + username + myProperties.getSuffix();
}
}

2、編寫(xiě)一個(gè)配置文件

這里為了獲取配置文件中的屬性值,springboot自動(dòng)配置源碼里大部分都是,這樣實(shí)現(xiàn)在一個(gè)配置文件中書(shū)寫(xiě),其他的可以按照開(kāi)頭獲取到屬性和值!

/**
* @author wangzhenjun
* @date 2022/10/14 16:28
*/
@Data
@ConfigurationProperties("wang.name")
public class MyProperties {

private String prefix;
private String suffix;
}

3、編寫(xiě)自動(dòng)配置

import com.wang.springbootautoconfigure.properties.MyProperties;
import com.wang.springbootautoconfigure.service.HelloService;
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;

/**
* @author wangzhenjun
* @date 2022/10/14 16:33
*/
@Configuration
//沒(méi)有這個(gè)bean的時(shí)候才會(huì)生效
@ConditionalOnMissingBean(HelloService.class)
// 加載配置文件,讓它成為容器中的bean
@EnableConfigurationProperties(MyProperties.class)
public class ServiceAutoConfiguration {
/**
* 把剛剛寫(xiě)的服務(wù),加入到容器中
*/
@Bean
public HelloService helloService (){

return new HelloService();
}
}

主要就是condition下的幾個(gè)注解,來(lái)完成bean是否加入到容器中:
常用的:

  • @ConditionalOnClass
  • @ConditionalOnMissingClass
  • @ConditionalOnBean
  • @ConditionalOnMissingBean
  • @ConditionalOnProperty

4、新建spring.factories

我們看到源碼里自動(dòng)配置,就是從這個(gè)文件獲取加載,所以我們模仿這新建一個(gè),這樣就可以掃描加入容器中!

如果是springboot2.7以上就是:文件夾名稱:META-INF.spring文件名稱:org.springframework.boot.autoconfigure.AutoConfiguration.imports。

里面直接寫(xiě)全類(lèi)名即可!

5、打包

先把spring-boot-autoconfigure?打包到本地庫(kù),在打包spring-boot-starter,順序一定要有,不然找不到前者的包!

六、測(cè)試

我們那一個(gè)新項(xiàng)目進(jìn)行測(cè)試,新項(xiàng)目小編就不帶大家建了!

1、導(dǎo)入咱們的starter依賴


com.wang
spring-boot-starter
1.0-SNAPSHOT

2、添加配置文件

wang:
name:
prefix: hello
suffix: 886

3、新建controller測(cè)試類(lèi)

@RestController
@RequestMapping("/test")
public class TestController {

@Autowired
private HelloService helloService;

@GetMapping("/starter")
public String starter(){

return helloService.HelloWord("tom");
}
}

4、測(cè)試訪問(wèn)

成功訪問(wèn),不過(guò)中文是有亂碼的,小編找不到解決方法,有懂的還請(qǐng)留言告知?。?br />主流程通了就行,慢慢理解了自動(dòng)配置的魅力!
總流程應(yīng)該就是這樣的:

引入starter --- xxxAutoConfiguration --- 容器中放入組件 ---- 綁定xxxProperties ---- 配置項(xiàng)。

中文是亂碼,可能是servlet沒(méi)有吧,有懂的可以留言告訴小編方案,謝謝大家!

七、總結(jié)

一看會(huì)就,一動(dòng)手就廢!大家還是要做自己實(shí)操,不要眼高手低,這樣才會(huì)有收獲,根本就是約定大于配置+SPI發(fā)現(xiàn)機(jī)制!還有就是一些經(jīng)常出現(xiàn)在源碼里的注解,大家記住就可以自己寫(xiě)starter了!


當(dāng)前名稱:手寫(xiě)自定義SpringBoot-Starter,感受框架的魅力和原理
標(biāo)題路徑:http://www.5511xx.com/article/djsdids.html