您好,登錄后才能下訂單哦!
這篇文章主要介紹了怎么搭建第一個(gè)Spring項(xiàng)目,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
模塊化的思想是 Spring 中非常重要的思想。
Spring 框架是一個(gè)分層架構(gòu),每個(gè)模塊既可以單獨(dú)使用,又可與其他模塊聯(lián)合使用。
每個(gè)「綠框」,對(duì)應(yīng)一個(gè)模塊,總共8個(gè)模塊; 「黑色包」,表示要實(shí)現(xiàn)這個(gè)模塊的 jar 包。
Core Container
,我們剛才已經(jīng)在文檔里看到過(guò)了,就是 IoC 容器,是核心,可以看到它依賴于這4個(gè) jar 包:
Beans
Core
Context
SpEL
, spring express language
那這里我們就知道了,如果想要用 IoC 這個(gè)功能,需要把這 4個(gè) jar 包導(dǎo)進(jìn)去。 其中,Core 模塊是 Spring 的核心,Spring 的所有功能都依賴于這個(gè) jar 包,Core 主要是實(shí)現(xiàn) IoC 功能,那么說(shuō)白了 Spring 的所有功能都是借助于 IoC 實(shí)現(xiàn)的。
其他的模塊和本文關(guān)系不大,不在這里展開(kāi)了。
那當(dāng)我們想搭建 Spring 項(xiàng)目時(shí),當(dāng)然可以把所有 jar 包都導(dǎo)進(jìn)去,但是你的電腦能受得了嗎。。但是包越大,項(xiàng)目越大,問(wèn)題就越多,所以盡量按需選擇,不用囤貨。。
Btw, 這張圖在網(wǎng)上有很多,但是在我卻沒(méi)有在最新版的 reference doc 上找到。。 不過(guò),既然那些老的教程里有,說(shuō)明老版本的 doc 里有,那去老版本的介紹 里找找看????
在本文第一張圖 Spring Framework
- Documentation
中我們選 4.3.26
的 Reference Doc.
,然后搜索“Framework Modules
”,就有啦~ 具體鏈接可以看文末參考資料。
還有一個(gè)方法,待會(huì)我們講到 jar 包中的內(nèi)容時(shí)再說(shuō)。
知道要導(dǎo)入哪些 jar 包了,那就找吧????。
下載地址:
如果你要問(wèn)我怎么找的,那就還是從剛才 4.3.26
版本的 Reference Doc
中進(jìn)去,然后剛開(kāi)頭就有一個(gè) Distribution Zip Files
,
好奇心帶著我打開(kāi)了它,發(fā)現(xiàn)...
發(fā)現(xiàn)了倉(cāng)庫(kù)地址!
打開(kāi)后發(fā)現(xiàn)是各個(gè)版本的 jar 包啊~
我們搜 5.2.3 版的,它在最下面:
然后就可以愉快的使用了~
Dist.zip
是 jar 包
Docs.zip
是文檔
其他的暫時(shí)先不用管~
下載好了之后,就好好看看 Spring 送我們的這份大禮包吧。
此處回答上文的遺留問(wèn)題:哪里找 Spring Framework 框架圖。
答案是:下載的 docs.zip → spring-framework-reference → images → spring-overview
我們需要導(dǎo)入 Intellij 的 jar 包在哪里呢? Dist.zip → libs
這里可以看到,每個(gè)黑色框?qū)?yīng)3個(gè) jar 包,我們要導(dǎo)入 Intellij 的是 RELEASE.jar
.
我們 new project
,不用 maven 構(gòu)架,就新建一個(gè)普通的 Java 項(xiàng)目,比如我就叫它 Spring_HelloWorld
,然后還是用我常用的 class Rectangle
的例子。
然后在 External Libraries 中導(dǎo)入我們剛才在模塊圖里看到的那4個(gè)模塊所對(duì)應(yīng)的 jar 包,結(jié)構(gòu)如下:
這樣你以為就大功告成了嗎?Too young too simple 啊~
來(lái)運(yùn)行一下:
出現(xiàn)了老盆友:no class def found error
, 就是找不到這個(gè)類。
我們谷歌 Maven common logging
并下載它的 jar 包,再加到項(xiàng)目里就可以了。
我上圖里是已經(jīng)加過(guò)了的,所以你會(huì)看到一個(gè) commons-logging-1.2
.
再運(yùn)行一下就可以了。這里的兩個(gè)文件上文都有截圖。
目前為止我們是手動(dòng)用 set()
方法設(shè)置對(duì)象的,那怎么用 Spring IoC 呢?
還需要有一個(gè)配置文件,可是這個(gè)文件需要配置啥,該怎么配置呢?
官網(wǎng)里都給我們寫(xiě)好了:
第一段是一些命名空間及其規(guī)范的介紹,
第二段就是給 bean
的屬性賦值了。
這里注意下 bean
里面的配置要改一下,改成我們這個(gè)項(xiàng)目對(duì)應(yīng)的。 這里的 id
, class
是什么意思呢?官網(wǎng)上也有解釋,我這里簡(jiǎn)單概括下:
bean
標(biāo)簽:告訴 Spring 要?jiǎng)?chuàng)建的對(duì)象
id
: 對(duì)象的唯一標(biāo)識(shí),就像每個(gè)人的身份證一樣,不可重復(fù)
class
: bean
的完全限定名,即從 package name 到 class name
property
:給屬性賦值,name
的名稱取決于 set()
方法后面的參數(shù);
其實(shí)也可以用 constructor 來(lái)賦值,name 的名稱取決于參數(shù)列表; 更多給復(fù)雜數(shù)據(jù)類型賦值的使用可以在官網(wǎng)查到。
當(dāng)然,在工作中更常用的是注解。但是往往也會(huì)有 xml 文件配合著一起使用的,所以還是要懂的。
我的 service 文件配置如下:
這里面并沒(méi)有直接的 new 這個(gè) service,但是 Spring 容器幫我們創(chuàng)建了這個(gè)對(duì)象。
那么 Spring 是如何幫我們創(chuàng)建對(duì)象的呢?
ApplicationContext
是 IoC 容器
的入口,其實(shí)也就是 Spring 程序
的入口, 剛才已經(jīng)說(shuō)過(guò)了它的兩個(gè)具體的實(shí)現(xiàn)子類,在這里用了從 class path 中讀取數(shù)據(jù)的方式;
然后第二行,就是獲取具體的 bean 了。這個(gè)其實(shí)有很多方式,在使用的時(shí)候就能看到:
點(diǎn)進(jìn)去發(fā)現(xiàn),是在 BeanFactory.class 里定義的:
這其中比較常用的是通過(guò)
Id → 需要 cast
Bean 的類型 → 只能在 Singleton 的時(shí)候使用,否則不知道用哪個(gè)呀
Id + 類型 → 下圖代碼示例
來(lái)獲取對(duì)象,最后兩種 String, Class objects 這種可變參數(shù)的方式用的很少。
照貓畫(huà)虎,我的 test 文件改動(dòng)如下:
成功運(yùn)行~~????????
實(shí)踐是檢驗(yàn)的唯一標(biāo)準(zhǔn):
再用 getBean()
得到一個(gè)對(duì)象,測(cè)試是否還是同一個(gè)。
即:
public class MyTest { public void test myTest() { ApplicationContext context = new ClassPathXmlApplicationContext("service.xml"); Rectangle rect = context.getBean("rectangle", Rectangle.class); Rectangle rect2 = context.getBean("rectangle", Rectangle.class); System.out.println(rect == rect2); } } }
返回 True or False?
答:True
因?yàn)槟J(rèn)是單例的,如果要改,需要在配置文件里改 <bean … scope = “prototype”>
.
至于這些標(biāo)簽的用法,這里不再延伸了~
實(shí)踐是檢驗(yàn)的唯一標(biāo)準(zhǔn):
定義一個(gè)無(wú)參的 constructor,里面打印一句話,然后只 new ClassPathXmlApplicationContext
,如下圖:
發(fā)現(xiàn)也是可以打印的,所以其實(shí)是每次啟動(dòng)容器的時(shí)候,就已經(jīng)創(chuàng)建好容器中的所有對(duì)象了。(當(dāng)然,這在 scope = "prototype"
的時(shí)候不適用,只是 singleton 的時(shí)候。)
多說(shuō)一句,其實(shí)最好應(yīng)該一直保留一個(gè)無(wú)參的 constructor,因?yàn)檫@里 bean 對(duì)象的創(chuàng)建是通過(guò)反射,
clazz.newInstance()
默認(rèn)是調(diào)用無(wú)參的 constructor
不過(guò),現(xiàn)在已經(jīng)被棄用掉了,換用了這個(gè):
clazz.getDeclaredConstructor().newInstance()
我們?cè)倩氐阶铋_(kāi)始的構(gòu)建項(xiàng)目,相信大家都體會(huì)到了手動(dòng)導(dǎo)入 jar 包的繁瑣之處,其實(shí)我們還可以用 Maven 來(lái)管理項(xiàng)目中的 jar 包,在公司中也是比較常用的一種方式,免除了手動(dòng)下載 jar 包的過(guò)程。
使用 Maven 的話就簡(jiǎn)化很多了,首先我們創(chuàng)建一個(gè) Maven 項(xiàng)目,不同于剛才的過(guò)程在于:
New Project 的時(shí)候要選擇從 Maven 構(gòu)建,而不是一個(gè)簡(jiǎn)單的 Java 項(xiàng)目。
建好之后,我們會(huì)發(fā)現(xiàn)比起剛才的 Java 項(xiàng)目,多了很多東西:
和之前的空項(xiàng)目不太一樣,這里有 main
, test
,其中 resources
是放配置文件的地方,也就是我們剛才的 service.xml
應(yīng)該放在這里,如果沒(méi)有放對(duì)位置是代碼找不到哦~
倉(cāng)庫(kù)地址 https://mvnrepository.com/
搜 spring
選擇 Spring context
→ 5.2.3 release
,把里面的配置 copy 到 pom.xml
中
最終在左邊 external libraries 會(huì)自動(dòng)出現(xiàn)所需的包,一鍵導(dǎo)入,不要太方便~
我們最后再來(lái)體會(huì)一下用 Spring 創(chuàng)建對(duì)象的過(guò)程:
通過(guò) ApplicationContext
這個(gè) IoC 容器的入口,用它的兩個(gè)具體的實(shí)現(xiàn)子類,從 class path 或者 file path 中讀取數(shù)據(jù),用 getBean()
獲取具體的 bean instance。
那使用 Spring 到底省略了我們什么工作?
答:new 的過(guò)程
。把 new 的過(guò)程交給第三方來(lái)創(chuàng)建、管理,這就是「解藕」。
Spring 也是用的 set()
方法,它只不過(guò)提供了一套更加完善的實(shí)現(xiàn)機(jī)制而已。
而說(shuō)到底,底層的原理并沒(méi)有很復(fù)雜,只是為了提高擴(kuò)展性、兼容性,Spring 提供了豐富的支持,所以才覺(jué)得源碼比較難。
因?yàn)榭蚣苁且o各種各樣的用戶來(lái)使用的,它們考慮的更多的是擴(kuò)展性。如果讓我們來(lái)實(shí)現(xiàn),或許三五行就能搞定,但是我們實(shí)現(xiàn)的不完善、不完整、不嚴(yán)謹(jǐn),總之不高大上,所以它寫(xiě)三五十行,把框架設(shè)計(jì)的盡可能的完善,提供了豐富的支持,滿足不同用戶的需求,才能占領(lǐng)更大的市場(chǎng)啊。
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“怎么搭建第一個(gè)Spring項(xiàng)目”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。