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

創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司提供網(wǎng)站設(shè)計和自適應(yīng)建站服務(wù)。團隊由有經(jīng)驗的網(wǎng)頁設(shè)計師、程序員和市場專家組成,能夠提供從H5建站,網(wǎng)站制作,一元廣告,模板建站到成都小程序開發(fā)等全方位服務(wù)。 以客戶為中心,致力于為客戶提供創(chuàng)新、高效的解決方案,幫助您打造成功的企業(yè)網(wǎng)站。
二、初探starter啟動原理
我們直接看看官網(wǎng)的starter是怎么設(shè)計的,仿照這寫一個就行了!
我們Ctrl點擊
org.springframework.boot
spring-boot-starter
2.5.3
compile
在此Ctrl點擊
org.springframework.boot
spring-boot-autoconfigure
2.5.3
compile
我們現(xiàn)在創(chuàng)建兩個項目即可:
- spring-boot-starter(啟動器)
- spring-boot-starter-autoconfigure(自動配置包)
小編看到官方這么寫的提醒,大家可以按照官網(wǎng)的進行起名稱,不要學(xué)小編哈?。?/p>
您應(yīng)該確保為您的啟動器提供適當(dāng)?shù)拿臻g。不要以 . 開頭的模塊名稱spring-boot,即使您使用不同的 Maven groupId。我們將來可能會為您自動配置的內(nèi)容提供官方支持。
根據(jù)經(jīng)驗,您應(yīng)該在啟動器之后命名組合模塊。例如,假設(shè)您正在為“acme”創(chuàng)建一個啟動器,并且您命名自動配置模塊acme-spring-boot和啟動器acme-spring-boot-starter。如果您只有一個模塊將兩者結(jié)合起來,請將其命名為acme-spring-boot-starter.
三、項目搭建
1、新建空白項目
輸入總的項目名稱:
在空白項目里新建兩個,這里可以分開單獨建立,這里小編跟著雷神一樣了,就不單獨建立項目了!
2、新建maven項目
包名和名稱:
3、新建springboot項目
4、項目架構(gòu)
這里把沒有用的都刪除了??!可以不刪。
四、配置
1、在starter項目中引入自己的autoconfigure依賴
就是上面建立項目的設(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
還是把沒用的東西刪除了,剩余如下圖:
五、編寫autoconfigure項目
1、配置一個bean
首先刪除了自動啟動類,咱們用不到,在spring-boot-autoconfigure項目中新建一個bean,此時不需要讓這個bean在容器中,我們寫一個自己配置,讓他自動加入到容器中。
這就是自動配置的思想。
/**
* 這里不需要讓在容器中,我們寫一個自己配置,讓他自動加入到容器中
* @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、編寫一個配置文件
這里為了獲取配置文件中的屬性值,springboot自動配置源碼里大部分都是,這樣實現(xiàn)在一個配置文件中書寫,其他的可以按照開頭獲取到屬性和值!
/**
* @author wangzhenjun
* @date 2022/10/14 16:28
*/
@Data
@ConfigurationProperties("wang.name")
public class MyProperties {
private String prefix;
private String suffix;
}
3、編寫自動配置
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
//沒有這個bean的時候才會生效
@ConditionalOnMissingBean(HelloService.class)
// 加載配置文件,讓它成為容器中的bean
@EnableConfigurationProperties(MyProperties.class)
public class ServiceAutoConfiguration {
/**
* 把剛剛寫的服務(wù),加入到容器中
*/
@Bean
public HelloService helloService (){
return new HelloService();
}
}
主要就是condition下的幾個注解,來完成bean是否加入到容器中:
常用的:
- @ConditionalOnClass
- @ConditionalOnMissingClass
- @ConditionalOnBean
- @ConditionalOnMissingBean
- @ConditionalOnProperty
4、新建spring.factories
我們看到源碼里自動配置,就是從這個文件獲取加載,所以我們模仿這新建一個,這樣就可以掃描加入容器中!
如果是springboot2.7以上就是:文件夾名稱:META-INF.spring文件名稱:org.springframework.boot.autoconfigure.AutoConfiguration.imports。
里面直接寫全類名即可!
5、打包
先把spring-boot-autoconfigure?打包到本地庫,在打包spring-boot-starter,順序一定要有,不然找不到前者的包!
六、測試
我們那一個新項目進行測試,新項目小編就不帶大家建了!
1、導(dǎo)入咱們的starter依賴
com.wang
spring-boot-starter
1.0-SNAPSHOT
2、添加配置文件
wang:
name:
prefix: hello
suffix: 886
3、新建controller測試類
@RestController
@RequestMapping("/test")
public class TestController {
@Autowired
private HelloService helloService;
@GetMapping("/starter")
public String starter(){
return helloService.HelloWord("tom");
}
}
4、測試訪問
成功訪問,不過中文是有亂碼的,小編找不到解決方法,有懂的還請留言告知!!
主流程通了就行,慢慢理解了自動配置的魅力!
總流程應(yīng)該就是這樣的:
引入starter --- xxxAutoConfiguration --- 容器中放入組件 ---- 綁定xxxProperties ---- 配置項。
中文是亂碼,可能是servlet沒有吧,有懂的可以留言告訴小編方案,謝謝大家!
七、總結(jié)
一看會就,一動手就廢!大家還是要做自己實操,不要眼高手低,這樣才會有收獲,根本就是約定大于配置+SPI發(fā)現(xiàn)機制!還有就是一些經(jīng)常出現(xiàn)在源碼里的注解,大家記住就可以自己寫starter了!
網(wǎng)站標(biāo)題:手寫自定義SpringBoot-Starter,感受框架的魅力和原理
文章地址:http://m.fisionsoft.com.cn/article/djsdids.html


咨詢
建站咨詢
