溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么搭建第一個(gè)Spring項(xiàng)目

發(fā)布時(shí)間:2021-11-20 16:39:48 來(lái)源:億速云 閱讀:132 作者:小新 欄目:大數(shù)據(jù)

這篇文章主要介紹了怎么搭建第一個(gè)Spring項(xiàng)目,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

Spring Framework 八大模塊

怎么搭建第一個(gè)Spring項(xiàng)目

模塊化的思想是 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.26Reference Doc.,然后搜索“Framework Modules”,就有啦~ 具體鏈接可以看文末參考資料。

還有一個(gè)方法,待會(huì)我們講到 jar 包中的內(nèi)容時(shí)再說(shuō)。

知道要導(dǎo)入哪些 jar 包了,那就找吧????。

一、手動(dòng)加載 jar 包的方式

1. 下載

下載地址:

怎么搭建第一個(gè)Spring項(xiàng)目

如果你要問(wèn)我怎么找的,那就還是從剛才 4.3.26 版本的 Reference Doc 中進(jìn)去,然后剛開(kāi)頭就有一個(gè) Distribution Zip Files

怎么搭建第一個(gè)Spring項(xiàng)目

好奇心帶著我打開(kāi)了它,發(fā)現(xiàn)...

怎么搭建第一個(gè)Spring項(xiàng)目

發(fā)現(xiàn)了倉(cāng)庫(kù)地址!

打開(kāi)后發(fā)現(xiàn)是各個(gè)版本的 jar 包啊~

我們搜 5.2.3 版的,它在最下面:

怎么搭建第一個(gè)Spring項(xiàng)目

然后就可以愉快的使用了~

  • Dist.zip 是 jar 包

  • Docs.zip 是文檔

其他的暫時(shí)先不用管~

下載好了之后,就好好看看 Spring 送我們的這份大禮包吧。

此處回答上文的遺留問(wèn)題:哪里找 Spring Framework 框架圖。

答案是:下載的 docs.zip → spring-framework-reference → images → spring-overview

怎么搭建第一個(gè)Spring項(xiàng)目

我們需要導(dǎo)入 Intellij 的 jar 包在哪里呢? Dist.zip → libs

怎么搭建第一個(gè)Spring項(xiàng)目

這里可以看到,每個(gè)黑色框?qū)?yīng)3個(gè) jar 包,我們要導(dǎo)入 Intellij 的是 RELEASE.jar.

2. 不用 IoC 構(gòu)建項(xiàng)目

我們 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)如下:

怎么搭建第一個(gè)Spring項(xiàng)目

這樣你以為就大功告成了嗎?Too young too simple 啊~

來(lái)運(yùn)行一下:

怎么搭建第一個(gè)Spring項(xiàng)目

出現(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 呢?

3. Spring IoC 配置文件詳解

還需要有一個(gè)配置文件,可是這個(gè)文件需要配置啥,該怎么配置呢?

官網(wǎng)里都給我們寫(xiě)好了:

怎么搭建第一個(gè)Spring項(xiàng)目

第一段是一些命名空間及其規(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 文件配置如下:

怎么搭建第一個(gè)Spring項(xiàng)目

4. 最后一步,我們?cè)賮?lái)看它是怎么用的:

怎么搭建第一個(gè)Spring項(xiàng)目

這里面并沒(méi)有直接的 new 這個(gè) service,但是 Spring 容器幫我們創(chuàng)建了這個(gè)對(duì)象。

那么 Spring 是如何幫我們創(chuàng)建對(duì)象的呢?

ApplicationContextIoC 容器的入口,其實(shí)也就是 Spring 程序的入口, 剛才已經(jīng)說(shuō)過(guò)了它的兩個(gè)具體的實(shí)現(xiàn)子類,在這里用了從 class path 中讀取數(shù)據(jù)的方式;

然后第二行,就是獲取具體的 bean 了。這個(gè)其實(shí)有很多方式,在使用的時(shí)候就能看到:

怎么搭建第一個(gè)Spring項(xiàng)目

點(diǎn)進(jìn)去發(fā)現(xiàn),是在 BeanFactory.class 里定義的:

怎么搭建第一個(gè)Spring項(xiàng)目

這其中比較常用的是通過(guò)

  • Id → 需要 cast

  • Bean 的類型 → 只能在 Singleton 的時(shí)候使用,否則不知道用哪個(gè)呀

  • Id + 類型 → 下圖代碼示例

來(lái)獲取對(duì)象,最后兩種 String, Class objects 這種可變參數(shù)的方式用的很少。

照貓畫(huà)虎,我的 test 文件改動(dòng)如下:

怎么搭建第一個(gè)Spring項(xiàng)目

成功運(yùn)行~~????????

Follow up 1. 對(duì)象在容器中默認(rè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)簽的用法,這里不再延伸了~

Follow up 2. 容器中的對(duì)象是什么時(shí)候創(chuàng)建的?

實(shí)踐是檢驗(yàn)的唯一標(biāo)準(zhǔn):

定義一個(gè)無(wú)參的 constructor,里面打印一句話,然后只 new ClassPathXmlApplicationContext,如下圖:

怎么搭建第一個(gè)Spring項(xiàng)目

發(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()

二、使用 Maven 構(gòu)建項(xiàng)目

我們?cè)倩氐阶铋_(kāi)始的構(gòu)建項(xiàng)目,相信大家都體會(huì)到了手動(dòng)導(dǎo)入 jar 包的繁瑣之處,其實(shí)我們還可以用 Maven 來(lái)管理項(xiàng)目中的 jar 包,在公司中也是比較常用的一種方式,免除了手動(dòng)下載 jar 包的過(guò)程。

1. 新建項(xiàng)目

使用 Maven 的話就簡(jiǎn)化很多了,首先我們創(chuàng)建一個(gè) Maven 項(xiàng)目,不同于剛才的過(guò)程在于:

New Project 的時(shí)候要選擇從 Maven 構(gòu)建,而不是一個(gè)簡(jiǎn)單的 Java 項(xiàng)目。

怎么搭建第一個(gè)Spring項(xiàng)目

建好之后,我們會(huì)發(fā)現(xiàn)比起剛才的 Java 項(xiàng)目,多了很多東西:

和之前的空項(xiàng)目不太一樣,這里有 main, test,其中 resources 是放配置文件的地方,也就是我們剛才的 service.xml 應(yīng)該放在這里,如果沒(méi)有放對(duì)位置是代碼找不到哦~

怎么搭建第一個(gè)Spring項(xiàng)目

2. 添加對(duì)應(yīng)的 pom 依賴,就不用手動(dòng)導(dǎo) jar 包了
  1. 倉(cāng)庫(kù)地址 https://mvnrepository.com/

  2. spring

  3. 選擇 Spring context5.2.3 release,把里面的配置 copy 到 pom.xml

最終在左邊 external libraries 會(huì)自動(dòng)出現(xiàn)所需的包,一鍵導(dǎo)入,不要太方便~

3. 寫(xiě)代碼~~????????

小結(jié)

我們最后再來(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)建、管理,這就是「解藕」。

怎么搭建第一個(gè)Spring項(xià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í)!

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI