Spring IOC 三種配置方式詳解
1 基于xml配置方式組件管理
1. 所有內(nèi)容寫到xml格式配置文件中
2. 聲明bean通過<bean標(biāo)簽
3. <bean標(biāo)簽包含基本信息(id,class)和屬性信息 <property name value / ref
4. 引入外部的properties文件可以通過<context:property-placeholder
<property> 是在 Spring XML 配置文件中用來設(shè)置 bean 的屬性值的元素。在上下文中,它通常作為 <bean> 元素的子元素出現(xiàn)。通過 <property> 元素可以設(shè)置 bean 的屬性,使得 Spring 容器在創(chuàng)建 bean 實(shí)例時(shí)可以自動(dòng)將這些屬性值注入到 bean 中。
例如,在上面提到的配置中,使用了 <property> 元素設(shè)置了數(shù)據(jù)源的 URL、驅(qū)動(dòng)類名、用戶名和密碼等屬性值。其基本結(jié)構(gòu)如下:

id 屬性指定了 bean 的唯一標(biāo)識(shí)符。
class 屬性指定了 bean 的類型。
<property> 元素用于設(shè)置 bean 的屬性值,name 屬性指定了屬性名,value 屬性指定了屬性值。
使用 <property> 元素可以完成對(duì)各種類型屬性的設(shè)置,例如基本數(shù)據(jù)類型、引用類型(如其他 bean)、集合類型等。
5. IoC具體容器實(shí)現(xiàn)選擇ClassPathXmlApplicationContext對(duì)象
在 Spring 中,IoC 容器是負(fù)責(zé)實(shí)例化、配置和組裝 bean 的核心容器。ClassPathXmlApplicationContext 是 Spring 提供的 IoC 容器實(shí)現(xiàn)之一,它從類路徑下的 XML 配置文件中讀取配置信息,并根據(jù)配置創(chuàng)建相應(yīng)的 bean 實(shí)例
如圖:

實(shí)現(xiàn)方式:

- 優(yōu)點(diǎn):XML配置方式提供了清晰的、結(jié)構(gòu)化的方式來描述Bean之間的依賴關(guān)系。它非常適合大型項(xiàng)目,其中可能有數(shù)百個(gè)Bean需要配置。此外,XML配置提供了良好的可讀性和可維護(hù)性,因?yàn)樗械呐渲枚技性谝粋€(gè)或多個(gè)XML文件中。
- 缺點(diǎn):XML配置可能會(huì)變得相當(dāng)冗長(zhǎng)和復(fù)雜,特別是當(dāng)項(xiàng)目中的Bean數(shù)量增加時(shí)。此外,XML配置是靜態(tài)的,這意味著在運(yùn)行時(shí)更改配置可能會(huì)比較困難。
2 基于注解方式管理
1. 注解負(fù)責(zé)標(biāo)記IoC的類和進(jìn)行屬性裝配
2. xml文件依然需要,需要通過<context:component-scan標(biāo)簽指定注解范圍
3. 標(biāo)記IoC注解:@Component,@Service,@Controller,@Repository
- @Component:
- 這是最通用的Spring組件注解,標(biāo)識(shí)一個(gè)類為Spring組件。被
@Component注解的類將會(huì)作為候選組件被Spring的上下文進(jìn)行掃描和自動(dòng)配置。 - 它不攜帶任何特殊的語義信息,僅僅表明該類是一個(gè)Spring組件。
- 這是最通用的Spring組件注解,標(biāo)識(shí)一個(gè)類為Spring組件。被
- @Service:
- 用于標(biāo)識(shí)業(yè)務(wù)邏輯層的組件(如服務(wù)類)。
@Service是@Component的一個(gè)特殊化版本,它提供了更加明確的語義,表明這個(gè)類是一個(gè)服務(wù)組件。- 通常,服務(wù)層負(fù)責(zé)實(shí)現(xiàn)業(yè)務(wù)邏輯,調(diào)用數(shù)據(jù)訪問層(由
@Repository標(biāo)識(shí)的組件)來獲取數(shù)據(jù),并可能將結(jié)果傳遞給表示層(由@Controller標(biāo)識(shí)的組件)。
- @Controller:
- 用于標(biāo)識(shí)Web應(yīng)用中的控制器組件。
@Controller是@Component的一個(gè)特殊化版本,用于處理HTTP請(qǐng)求,通常與Spring MVC一起使用。- 在控制器中,你可以定義方法來處理特定的HTTP請(qǐng)求,并返回視圖名稱或響應(yīng)體。
- @Repository:
- 用于標(biāo)識(shí)數(shù)據(jù)訪問層的組件(如DAO類)。
@Repository是@Component的一個(gè)特殊化版本,它提供了更加明確的語義,表明這個(gè)類是一個(gè)數(shù)據(jù)訪問組件。- 在數(shù)據(jù)訪問層,你可以定義方法來訪問數(shù)據(jù)庫、執(zhí)行CRUD操作等。
- Spring提供了額外的異常轉(zhuǎn)換功能,可以將來自數(shù)據(jù)訪問層的異常轉(zhuǎn)換為
DataAccessException類型的異常,這使得開發(fā)者可以更容易地處理這些異常。


4. 標(biāo)記DI注解:@Autowired @Qualifier @Resource @Value
- @Autowired
@Autowired是Spring提供的一個(gè)注解,用于自動(dòng)裝配bean。它可以自動(dòng)裝配構(gòu)造器、setter方法或字段。當(dāng)Spring容器在創(chuàng)建bean時(shí),如果bean中包含了使用@Autowired注解的屬性或方法,Spring容器將自動(dòng)查找匹配的bean進(jìn)行注入。- 如果存在多個(gè)相同類型的bean,Spring將不知道要注入哪一個(gè),這時(shí)就需要使用
@Qualifier注解來指定要注入的bean的名稱。 - 默認(rèn)情況下,
@Autowired是必需的(即如果找不到匹配的bean,則會(huì)拋出異常)。但是,你可以通過@Autowired(required = false)來指定注入是可選的。
- @Qualifier
@Qualifier通常與@Autowired一起使用,用于消除多個(gè)相同類型bean的歧義。當(dāng)Spring容器中存在多個(gè)相同類型的bean時(shí),你可以使用@Qualifier注解來指定要注入的bean的名稱。@Qualifier可以用在方法、字段或構(gòu)造器參數(shù)的上面,但最常見的用法是結(jié)合@Autowired一起使用在字段或setter方法上。
- @Resource
@Resource是Java EE提供的注解,用于注入資源,如JavaBean、數(shù)據(jù)源等。在Spring中,它也可以用于自動(dòng)裝配bean。@Resource可以指定要注入的bean的名稱(通過name屬性)或類型(通過type屬性)。如果同時(shí)指定了name和type,Spring將首先按name查找,然后按type查找。@Resource的一個(gè)優(yōu)點(diǎn)是,即使沒有匹配的bean,它也不會(huì)拋出異常(這取決于@Resource的具體用法和配置)。
- @Value
@Value注解用于注入SpEL(Spring Expression Language)表達(dá)式、屬性文件中的值或字面量值。- 你可以使用
@Value來注入基本類型、字符串、其他bean的屬性或SpEL表達(dá)式的結(jié)果。 - 例如,你可以使用
@Value("${some.property}")來注入屬性文件中的值,或者使用@Value("#{someBean.someProperty}")來注入其他bean的屬性值。


5. IoC具體容器實(shí)現(xiàn)選擇ClassPathXmlApplicationContext對(duì)象
如圖:

調(diào)用:

- 優(yōu)點(diǎn):注解配置方式將配置信息直接嵌入到Java代碼中,使得代碼和配置更加緊密地結(jié)合在一起。這減少了配置文件的數(shù)量,使得項(xiàng)目更加簡(jiǎn)潔。此外,注解配置支持在運(yùn)行時(shí)動(dòng)態(tài)地修改配置,這增加了靈活性。
- 缺點(diǎn):過度使用注解可能會(huì)導(dǎo)致代碼混亂和難以維護(hù)。此外,注解配置不如XML配置直觀,可能需要更多的時(shí)間來學(xué)習(xí)和理解。
3 配置類方式管理
1. 完全注解方式指的是去掉xml文件,使用配置類 + 注解實(shí)現(xiàn)
2. xml文件替換成使用@Configuration注解標(biāo)記的類
3. 標(biāo)記IoC注解:@Component,@Service,@Controller,@Repository
4. 標(biāo)記DI注解:@Autowired @Qualifier @Resource @Value
5. <context:component-scan標(biāo)簽指定注解范圍使用@ComponentScan(basePackages ={"com.atguigu.components"})替代
6. <context:property-placeholder引入外部配置文件使用@PropertySource({"classpath:application.properties","classpath:jdbc.properties"})替代
7. <bean 標(biāo)簽使用@Bean注解和方法實(shí)現(xiàn)
8. IoC具體容器實(shí)現(xiàn)選擇AnnotationConfigApplicationContext對(duì)象
配置類:

調(diào)用:

- 優(yōu)點(diǎn):JavaConfig配置方式使用Java類來定義Bean及其依賴關(guān)系,這使得配置更加類型安全,并且易于使用IDE的功能(如自動(dòng)補(bǔ)全和重構(gòu))。此外,JavaConfig配置支持在運(yùn)行時(shí)動(dòng)態(tài)地修改配置,并且可以與XML和注解配置混合使用。
- 缺點(diǎn):JavaConfig配置需要編寫額外的Java代碼來定義Bean和依賴關(guān)系,這可能會(huì)增加項(xiàng)目的復(fù)雜性。此外,JavaConfig配置可能不如XML配置直觀,特別是對(duì)于初學(xué)者來說。
以上就是Spring IOC 三種配置方式詳解的詳細(xì)內(nèi)容,更多關(guān)于Spring IOC配置的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Spring IOC創(chuàng)建對(duì)象的兩種方式
這篇文章主要給大家介紹了關(guān)于Spring IOC創(chuàng)建對(duì)象的兩種方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
Java實(shí)現(xiàn)多任務(wù)執(zhí)行助手
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)多任務(wù)執(zhí)行助手,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08
Spring Security在標(biāo)準(zhǔn)登錄表單中添加一個(gè)額外的字段
這篇文章主要介紹了Spring Security在標(biāo)準(zhǔn)登錄表單中添加一個(gè)額外的字段,我們將重點(diǎn)關(guān)注兩種不同的方法,以展示框架的多功能性以及我們可以使用它的靈活方式。 需要的朋友可以參考下2019-05-05
Mybatis如何按順序查詢出對(duì)應(yīng)的數(shù)據(jù)字段
這篇文章主要介紹了Mybatis如何按順序查詢出對(duì)應(yīng)的數(shù)據(jù)字段,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01
如何將eclipse項(xiàng)目導(dǎo)入到idea的方法步驟(圖文)
這篇文章主要介紹了如何將eclipse項(xiàng)目導(dǎo)入到idea的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
Java模擬rank/over函數(shù)實(shí)現(xiàn)獲取分組排名的方法詳解
這篇文章主要為大家詳細(xì)介紹了Java模擬rank()、over()函數(shù)獲取分組排名的方法設(shè)計(jì)及實(shí)現(xiàn),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-04-04
springboot集成elasticsearch7的圖文方法
本文記錄springboot集成elasticsearch7的方法,本文通過圖文實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),需要的朋友參考下吧2021-05-05
java final 和instanceof 關(guān)鍵字的區(qū)別
這篇文章介紹了java final 和instanceof 關(guān)鍵字的區(qū)別,有需要的朋友可以參考一下2013-09-09

