Spring的開發(fā)要點總結(jié)
【JavaEE】Spring的開發(fā)要點總結(jié)(1)
Spring的初步了解博客:【JavaEE】JavaEE進(jìn)階:框架的學(xué)習(xí) - Spring的初步認(rèn)識_s:103的博客-CSDN博客
就不帶大家回顧了~
從框架獲取的對象稱為獲取【Bean對象】!
Java是咖啡,Bean就是"咖啡豆",也就是“對象”
Spring項目開發(fā)就是 開業(yè),放咖啡豆到罐子里,后續(xù)從罐子里拿咖啡豆,結(jié)合豆子用咖啡機(jī)做咖啡,咖啡給用戶喝,的過程~
1. DI 和 DL
1.1 DI 依賴注入
在Spring項目中,DI通常指的是Dependency Injection(依賴注入)。Spring框架是一個使用DI作為核心思想的開源框架,它通過依賴注入的方式管理和注入對象之間的依賴關(guān)系。
指的是,在程序運(yùn)行期間動態(tài)地將“依賴對象”獲取到的過程
以Framework構(gòu)造方法為例,需要一個依賴對象“bottom”,那么就在運(yùn)行的時候,動態(tài)地在框架內(nèi)部去查詢到對應(yīng)地Bean對象,然后賦值給bottom
這就是依賴的注入~
后面真正進(jìn)入Spring代碼的學(xué)習(xí)的時候,會有更好的理解!
1.2 DL 依賴查詢
在Spring項目中,DL通常指的是Dependency Lookup(依賴查找)。Dependency Lookup 是一種在運(yùn)行時通過容器來查找和獲取依賴對象的方式。
DL與DI不同的最大一點就是,DL顯式的去從框架內(nèi)部獲取Bean對象,然后自己去賦值給對應(yīng)的對象:
后面真正進(jìn)入Spring代碼的學(xué)習(xí)的時候,會有更好的理解!
1.3 DI 與 DL的區(qū)別
- 靜態(tài)與動態(tài):
- DI 是在對象創(chuàng)建時將依賴注入到對象中
- 而DL 是在運(yùn)行時通過容器查找和獲取依賴對象。
- 控制權(quán):
- DI 將控制權(quán)交給容器,在對象創(chuàng)建時由容器負(fù)責(zé)注入依賴對象
- 而 DL 則由代碼顯式調(diào)用容器的方法來獲取依賴對象,控制權(quán)更多地在代碼手中。
- 依賴關(guān)系的表達(dá):
- DI 的依賴關(guān)系通過構(gòu)造函數(shù)、Setter方法或注解等方式在類的定義中表達(dá)
- 而 DL 則需要在代碼中顯式地調(diào)用容器的方法來獲取依賴對象。
- 靈活性:
- DI 可以更方便地進(jìn)行單元測試和模擬依賴對象,因為依賴對象可以通過構(gòu)造函數(shù)或 Setter 方法注入
- 而 DL 則需要運(yùn)行時訪問容器,不太適合在測試環(huán)境中進(jìn)行模擬。
- 松耦合與緊耦合:
- DI 通過將依賴對象注入到類中實現(xiàn)了松耦合,對象不需要關(guān)心如何獲取依賴
- 而 DL 則需要顯式地調(diào)用容器方法來獲取依賴,導(dǎo)致對象與容器之間緊密耦合。
后面真正進(jìn)入Spring代碼的學(xué)習(xí)的時候,會有更好的理解!
1.4 IoC 與 DI/DL 的區(qū)別
IoC是“目標(biāo)”的一種思想,而IoC就是只是“指導(dǎo)原則”,“Spring的基本思想”
DI/DL則是“落實的方案”,就屬于“Spring特點的具體實現(xiàn)”
IoC是控制權(quán)的反轉(zhuǎn),“向框架要對象”,那么Bean對象是怎么給我們的,就是DI/DL
接下來就要創(chuàng)建Spring項目了,(配置國內(nèi)源哦,在上一篇文章中有提到~)
2. Spring項目的創(chuàng)建
2.1 創(chuàng)建Maven項目
Spring項目的基礎(chǔ)就是Maven項目:
然后輸入創(chuàng)建目錄,確認(rèn):
2.2 設(shè)置國內(nèi)源
2.2.1 勾選
- 以后的設(shè)置一并改了
2.2.2 刪除本地jar包
之前留下的jar包很有可能,是你沒有設(shè)置國內(nèi)源,導(dǎo)致一些jar包不完整,導(dǎo)致后續(xù)無法重新向中央倉庫下載這些jar包~
delete刪除即可:
2.2.3 reload
耐心等待~
這個時間就差不多~
2.3 添加依賴
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
</dependencies>
- 建議把這些常用的依賴放在git上的代碼片段上,方便獲取
- 這里版本號后面是release也沒問題~
- 因為國內(nèi)源里確實存在~
添加的框架有 spring-context:spring 上下文,還有 spring-beans:管理對象的模塊
2.4 創(chuàng)建啟動類
項目的運(yùn)行的就是main方法~
- 很多知識要到后面才能理解哦,一步步來!
3. 將Bean對象存儲到Spring(IoC容器)中
3.1 創(chuàng)建一個Bean對象
一個Bean對象,無非就是java中的一個普通的類的一個實例罷了~
3.2 將Bean對象存儲到Spring中
3.2.1 配置文件
這個時候就需要一個配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
- 直接復(fù)制過去即可
- resources就是放一些配置文件的~
- 取名規(guī)則:寫實,直觀,表達(dá)文件內(nèi)容含義
爆紅的話,reload一下~
3.2.2 包含一個bean標(biāo)簽
-
id
- 將對象存儲到IoC容器中的名字
-
class
- 要存儲到IoC中的Bean的完整路徑
創(chuàng)建一個包
把UserService拖進(jìn)去
默認(rèn)是不分組的,去掉這個√,就分組了
而bean標(biāo)簽的class屬性,就是類的路徑~
-
包名.類名
兩個對象~
這一步雖然看似我們將這個類的對象放進(jìn)Spring中,但是只起到“聲明”的作用~
因為IoC容器加載對象,如果是懶漢模式,即是非必要不加載,所以這一步就是聲明,對象在容器中的“名字”和“位置”
所以代碼在運(yùn)行的過程中加載才會通過這個配置文件,將Bean放進(jìn)容器中~
3.3 獲取Bean對象并使用
獲取和使用都在啟動類的main方法中~
3.3.1 獲取Spring的上下文對象
沒有題詞很正常,打出來就行了,然后導(dǎo)包
法1:ApplicationContext
- 用單詞全稱的好處就是,打錯字會有提醒~
法2:BeanFactory
兩種方式都能獲取,區(qū)別在后面講解~
上下文對象:
- 上下文(Context)在一般語境下指的是某個事件、問題或情況發(fā)生的背景和環(huán)境。它是指在特定的時間、地點或條件下所處的整體情況、狀態(tài)或背景。
- 上下文對象是指在特定環(huán)境中包含了相關(guān)信息和狀態(tài)的對象。它提供了在該環(huán)境中執(zhí)行操作所需的上下文信息。
在這里的話,就是蘊(yùn)含了容器存儲的Bean對象的信息~
不好理解上下文對象,那你就理解成,IoC容器管理器~
3.3.2 通過Spring的上下文對象,獲取一個指定的Bean對象
- 這里填的就是Bean對象的名字,也就是在配置文件中的id~
但是這個方法返回的結(jié)果是Object類型,需要強(qiáng)制類型轉(zhuǎn)化:
或者,用類對象作為參數(shù):
- 返回這個類的一個Bean對象
但是運(yùn)行時錯誤:
字面意思就是,不唯一Bean定義異常
確實如此,有兩個UserService的Bean對象
最好的一種方法就是,傳兩個參數(shù),一個id,一個類對象:
3.3.3 使用Bean對象
public static void main(String[] args) {
//1. 得到Spring的上下文對象
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext("spring-config.xml");
//2. 得到Bean
// UserService userService = (UserService) applicationContext.getBean("user");
UserService userService = applicationContext.getBean("user", UserService.class);
//3. 使用Bean
userService.sayHi();
}
3.3.4 驗證懶加載-兩種獲取Bean對象的方法的區(qū)別
我們在UserService的構(gòu)造方法上添上一筆
注釋一些代碼:
運(yùn)行:
對于ApplicationContext,是一種全加載的方式
對于BeanFactory,則是一種懶加載的方式
所以我們在回答問題的時候要這樣:
相同點:都是容器的管理對象,都能獲取Bean對象
區(qū)別:
- ApplicationContext是BeanFactory的一個子類(子孫之一)
因此,ApplicationContext擁有更多的功能
- 國際化支持
- 資源訪問支持
- 事件傳播支持
- …
- 加載機(jī)制不同
- BeanFactory,比較老,在之前資源匱乏,所以要珍惜資源,所以懶加載可以節(jié)省資源
- 啟動快,后期的獲取慢
- ApplicationContext,則是現(xiàn)在資源不成問題,配置文件全部一起加載也無妨~
- 啟動慢,后期的獲取快
而以上IoC機(jī)制的實現(xiàn),就是DL,依賴查找的方式,就是通過給定的配置文件,在配置文件中的beans里查找Bean對象的聲明,找到對象并返回~
文章到此結(jié)束!謝謝觀看
可以叫我 小馬,我可能寫的不好或者有錯誤,但是一起加油鴨??!本文代碼鏈接:SpringDemo1 · 游離態(tài)/馬拉圈2023年7月 - 碼云 - 開源中國 (gitee.com)文章來源:http://www.zghlxwxcb.cn/news/detail-587783.html
可見,這樣子做,獲得一個對象太麻煩了,下一篇文章教你簡單的存儲和獲取Bean對象,并且結(jié)合DI~文章來源地址http://www.zghlxwxcb.cn/news/detail-587783.html
到了這里,關(guān)于【JavaEE】DI與DL的介紹-Spring項目的創(chuàng)建-Bean對象的存儲與獲取的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!