Spring-boot原理及spring-boot-starter實(shí)例和代碼

Spring-boot自出現(xiàn)后,到現(xiàn)在火的很,大家貌似都在用,連招聘里面也要求會(huì)這個(gè)。但是說實(shí)話,spring-boot無外乎想實(shí)現(xiàn)一種可插拔的編程方式,說是簡化配置,其實(shí)并沒有減少多少,只不過把配置落到代碼里面,通過各種annotation來標(biāo)示了。
作為個(gè)人其實(shí)不太愿意團(tuán)隊(duì)用spring-boot這種層層封裝的方式,各種jar鋪天蓋地,最終大家都被綁架了,自己底層的能力不一定有什么提高。
spring-boot的starter又是個(gè)什么鬼?
一句話,spring-boot的starter是一個(gè)通過maven完成自包含并通過annotation配置使得可被spring上下文發(fā)現(xiàn)并實(shí)例化的一個(gè)可插拔的組件或服務(wù)。
spring-boot有兩種starter
一種是內(nèi)部已經(jīng)支持的,一種是第三方的。
內(nèi)部支持starter:
其通過@ConditionalOnClass來實(shí)決定是否例化(ConditionalOnClass是指當(dāng)在classpath發(fā)現(xiàn)需要的依賴的類時(shí)實(shí)例化),想要啟動(dòng)這個(gè)服務(wù),只要要配置上對應(yīng)的starter,這個(gè)starter就能把所需要的jar給關(guān)聯(lián)上。
類似于我們對log的使用,默認(rèn)使用slf4j這個(gè)api接口,提供一個(gè)鉤子,classpath里面誰實(shí)現(xiàn)了這個(gè)機(jī)構(gòu),誰就掛到這個(gè)鉤子上成為log具體實(shí)現(xiàn),其中l(wèi)og4j就是一個(gè)實(shí)現(xiàn)。
通過spring的如下maven配置即可看見里面已經(jīng)通過dependencyManagement(這個(gè)時(shí)maven的依賴管理,不用的時(shí)候不會(huì)加載)給你配置好了所有內(nèi)置starter。只需要用的時(shí)候把對應(yīng)的starter依賴配置上就行了。
<dependency> jpg <groupId>org.springframework.boot</groupId> jpg <artifactId>spring-boot-starter</artifactId> < jpg/dependency>
所有的starter其實(shí)都是要通過代碼配置被上下文發(fā)現(xiàn)的,可以在spring-boot-autoconfigure-xxx.jar去看,如下:。

內(nèi)置的tomcat,jetty也在里面:

具體代碼:
通過ConditionalOnClass只要發(fā)現(xiàn)了tomcat這個(gè)類(配置了spring-boot-starter-web的maven依賴后就會(huì)會(huì)有),就會(huì)啟動(dòng)tomcat的服務(wù)。

第三方starter:
比如mybatis等。
原理是一樣的,就是在你已經(jīng)實(shí)現(xiàn)的服務(wù)代碼之上封裝一層配置代碼就行,看看mybitis的,這是mybatis-spring-boot-starter的依賴。
<dependency> jpg<groupId>org.mybatis.spring.boot</groupId> jpg<artifactId>mybatis-spring-boot-starter</artifactId> jpg<version>1.3.0</version> jpg</dependency>
這個(gè)依賴是一個(gè)pom,點(diǎn)進(jìn)去可以看見自包含的依賴關(guān)系,其中一個(gè)就是mybatis的autoConfigure,通過@bean等annotation完成對mybatis的實(shí)例化配置,如下:

具體代碼:

基于這個(gè)機(jī)制,我們自己也可以實(shí)現(xiàn)一個(gè)
本次實(shí)現(xiàn)一個(gè)簡單的數(shù)據(jù)庫操作組件,類似于mybatis,只不過只實(shí)現(xiàn)了簡單的查詢服務(wù)。
整個(gè)示例有兩個(gè)工程:
一個(gè)實(shí)現(xiàn)我們自己的starter(取名叫spring-boot-mydao-starter),最后會(huì)打成ar包,并install到本地maven本地廠庫里。
另外一個(gè)工程用于測試,最終會(huì)依賴spring-boot-mydao-starter整個(gè)組件,并調(diào)用里面的查詢服務(wù)去測試。

工程
具體類如下:
1、創(chuàng)建spring-boot-mydao-starter工程,添加相關(guān)依賴配置
我們實(shí)現(xiàn)的這個(gè)組件僅僅依賴于mysql的驅(qū)動(dòng)以及spring-boot的上下文環(huán)境。其中mysql驅(qū)動(dòng)用的spring-boot-starter-parent里面配置好的,這里直接用即可,maven配置如下:

2、實(shí)現(xiàn)以下幾個(gè)類:
Mydao:封裝數(shù)據(jù)庫的連接和查詢服務(wù),和spring沒有任何關(guān)系。
MyDaoAutoConfiguration:提供MyDao的配置用于啟動(dòng)時(shí)被spring上下文發(fā)現(xiàn)并解析。
DbProperties:完成對數(shù)據(jù)庫配置參數(shù)文件的讀?。╠b.properties,當(dāng)然spring-boot也支持其他格式的配置文件,個(gè)人還是喜歡傳統(tǒng)樣式)。
其中Mydao:

MyDaoAutoConfiguration(將配置參數(shù)對象傳給Mydao并配置Mydao實(shí)例):
Spring在啟動(dòng)時(shí)會(huì)通過@Bean實(shí)例化Mydao并將其放入ConfigurableApplicationContext容器中。

配置文件類DbProperties:
自動(dòng)讀取classpath下的db.properties的配置文件,并實(shí)例化成類對象。配置文件需要在測試的工程(test-spring-boot-mydao-starter)里提供。

配置文件db.properties

以上就是真?zhèn)€starter的類容。下面描述如何使用這個(gè)starter。
新建測試工程test-spring-boot-mydao-starter(起啥名都行)。配置上對我們的starter的依賴:
因?yàn)閟tarter里面已經(jīng)依賴了spring-boot的上下文,所以這里就不用配置了。

然后就是測試:
我們用mysql自帶的數(shù)據(jù)庫里面的user表做測試。以下是測試類,需要注入starter里面的mydao:

然后就是啟動(dòng)測試:

也可以用spring的junit來測試。
總結(jié)
以上所述是小編給大家介紹的Spring-boot原理及spring-boot-starter實(shí)例和代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!
相關(guān)文章
SpringBoot+JWT實(shí)現(xiàn)單點(diǎn)登錄完美解決方案
單點(diǎn)登錄是一種統(tǒng)一認(rèn)證和授權(quán)機(jī)制,指在多個(gè)應(yīng)用系統(tǒng)中,用戶只需要登錄一次就可以訪問所有相互信任的系統(tǒng),不需要重新登錄驗(yàn)證,這篇文章主要介紹了SpringBoot+JWT實(shí)現(xiàn)單點(diǎn)登錄解決方案,需要的朋友可以參考下2023-07-07
springboot結(jié)合ehcache防止惡意刷新請求的實(shí)現(xiàn)
這篇文章主要介紹了springboot結(jié)合ehcache防止惡意刷新請求的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
JAVA中出現(xiàn)異常、拋出異常后續(xù)代碼是否執(zhí)行情況詳析
當(dāng)產(chǎn)生異常后,并在異常處理器中進(jìn)行執(zhí)行之后,程序會(huì)是如何的一種狀態(tài),是終止還是繼續(xù)執(zhí)行處理之后的代碼呢,下面這篇文章主要給大家介紹了關(guān)于JAVA中出現(xiàn)異常、拋出異常后續(xù)代碼是否執(zhí)行情況的相關(guān)資料,需要的朋友可以參考下2024-05-05
java?實(shí)現(xiàn)獲取指定位置后的第一個(gè)數(shù)字
這篇文章主要介紹了java?實(shí)現(xiàn)獲取指定位置后的第一個(gè)數(shù)字,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01
Java如何獲取當(dāng)天零點(diǎn)和明天零點(diǎn)的時(shí)間和時(shí)間戳
這篇文章主要介紹了如何在Java中獲取當(dāng)天零點(diǎn)和明天零點(diǎn)的時(shí)間和時(shí)間戳,并提供了示例代碼,新手小白完全可以通過文中介紹的代碼實(shí)現(xiàn),需要的朋友可以參考下2025-03-03
SpringCloud將Nacos作為配置中心實(shí)現(xiàn)流程詳解
這篇文章主要介紹了Springcloud中的Nacos Config服務(wù)配置,本文以用戶微服務(wù)為例,進(jìn)行統(tǒng)一的配置,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-10-10

