Spring-boot自出現(xiàn)后匆绣,到現(xiàn)在火的很,大家貌似都在用什黑,連招聘里面也要求會這個崎淳。但是說實話,spring-boot無外乎想實現(xiàn)一種可插拔的編程方式愕把,說是簡化配置拣凹,其實并沒有減少多少,只不過把配置落到代碼里面恨豁,通過各種annotation來標示了嚣镜。
作為個人其實不太愿意團隊用spring-boot這種層層封裝的方式,各種jar鋪天蓋地圣絮,最終大家都被綁架了祈惶,自己底層的能力不一定有什么提高雕旨。
spring-boot的starter又是個什么鬼扮匠?
一句話捧请,spring-boot的starter是一個通過maven完成自包含并通過annotation配置使得可被spring上下文發(fā)現(xiàn)并實例化的一個可插拔的組件或服務(wù)。
spring-boot有兩種starter
一種是內(nèi)部已經(jīng)支持的棒搜,一種是第三方的疹蛉。
內(nèi)部支持starter:
其通過@ConditionalOnClass來實決定是否例化(ConditionalOnClass是指當在classpath發(fā)現(xiàn)需要的依賴的類時實例化),想要啟動這個服務(wù)力麸,只要要配置上對應(yīng)的starter可款,這個starter就能把所需要的jar給關(guān)聯(lián)上。
類似于我們對log的使用克蚂,默認使用slf4j這個api接口闺鲸,提供一個鉤子,classpath里面誰實現(xiàn)了這個機構(gòu)埃叭,誰就掛到這個鉤子上成為log具體實現(xiàn)摸恍,其中l(wèi)og4j就是一個實現(xiàn)。
通過spring的如下maven配置即可看見里面已經(jīng)通過dependencyManagement(這個時maven的依賴管理赤屋,不用的時候不會加載)給你配置好了所有內(nèi)置starter立镶。只需要用的時候把對應(yīng)的starter依賴配置上就行了。
<dependency>
?<groupId>org.springframework.boot</groupId>
?<artifactId>spring-boot-starter</artifactId> <
/dependency>
所有的starter其實都是要通過代碼配置被上下文發(fā)現(xiàn)的类早,可以在spring-boot-autoconfigure-xxx.jar去看媚媒,如下:。
內(nèi)置的tomcat涩僻,jetty也在里面:
具體代碼:
通過ConditionalOnClass只要發(fā)現(xiàn)了tomcat這個類(配置了spring-boot-starter-web的maven依賴后就會會有)缭召,就會啟動tomcat的服務(wù)。
第三方starter:
比如mybatis等逆日。
原理是一樣的恼琼,就是在你已經(jīng)實現(xiàn)的服務(wù)代碼之上封裝一層配置代碼就行,看看mybitis的屏富,這是mybatis-spring-boot-starter的依賴晴竞。
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
這個依賴是一個pom,點進去可以看見自包含的依賴關(guān)系狠半,其中一個就是mybatis的autoConfigure噩死,通過@bean等annotation完成對mybatis的實例化配置,如下:
具體代碼:
基于這個機制,我們自己也可以實現(xiàn)一個
本次實現(xiàn)一個簡單的數(shù)據(jù)庫操作組件神年,類似于mybatis已维,只不過只實現(xiàn)了簡單的查詢服務(wù)。
整個示例有兩個工程:
一個實現(xiàn)我們自己的starter(取名叫spring-boot-mydao-starter)已日,最后會打成ar包垛耳,并install到本地maven本地廠庫里。
另外一個工程用于測試,最終會依賴spring-boot-mydao-starter整個組件堂鲜,并調(diào)用里面的查詢服務(wù)去測試栈雳。
具體類如下:
1、創(chuàng)建spring-boot-mydao-starter工程缔莲,添加相關(guān)依賴配置
我們實現(xiàn)的這個組件僅僅依賴于mysql的驅(qū)動以及spring-boot的上下文環(huán)境哥纫。其中mysql驅(qū)動用的spring-boot-starter-parent里面配置好的,這里直接用即可痴奏,maven配置如下:
2蛀骇、實現(xiàn)以下幾個類:
Mydao:封裝數(shù)據(jù)庫的連接和查詢服務(wù),和spring沒有任何關(guān)系读拆。
MyDaoAutoConfiguration:提供MyDao的配置用于啟動時被spring上下文發(fā)現(xiàn)并解析擅憔。
DbProperties:完成對數(shù)據(jù)庫配置參數(shù)文件的讀取(db.properties檐晕,當然spring-boot也支持其他格式的配置文件雕欺,個人還是喜歡傳統(tǒng)樣式)。
其中Mydao:
MyDaoAutoConfiguration(將配置參數(shù)對象傳給Mydao并配置Mydao實例):
Spring在啟動時會通過@Bean實例化Mydao并將其放入ConfigurableApplicationContext容器中棉姐。
配置文件類DbProperties:
自動讀取classpath下的db.properties的配置文件屠列,并實例化成類對象。配置文件需要在測試的工程(test-spring-boot-mydao-starter)里提供伞矩。
配置文件db.properties
以上就是真?zhèn)€starter的類容笛洛。下面描述如何使用這個starter。
新建測試工程test-spring-boot-mydao-starter(起啥名都行)乃坤。配置上對我們的starter的依賴:
因為starter里面已經(jīng)依賴了spring-boot的上下文苛让,所以這里就不用配置了。
然后就是測試:
我們用mysql自帶的數(shù)據(jù)庫里面的user表做測試湿诊。以下是測試類狱杰,需要注入starter里面的mydao:
然后就是啟動測試:
也可以用spring的junit來測試。
~以上便是本次分享所有內(nèi)容~
源碼下載
為防止地址失效厅须,所有下載鏈接都在公眾號維護仿畸,請關(guān)注公眾號后,回復(fù)“R003” 獲取完整源碼朗和。