Spring IOC 三種配置方式詳解
1 基于xml配置方式組件管理
1. 所有內(nèi)容寫(xiě)到xml格式配置文件中
2. 聲明bean通過(guò)<bean標(biāo)簽
3. <bean標(biāo)簽包含基本信息(id,class)和屬性信息 <property name value / ref
4. 引入外部的properties文件可以通過(guò)<context:property-placeholder
<property>
是在 Spring XML 配置文件中用來(lái)設(shè)置 bean 的屬性值的元素。在上下文中,它通常作為 <bean>
元素的子元素出現(xiàn)。通過(guò) <property>
元素可以設(shè)置 bean 的屬性,使得 Spring 容器在創(chuàng)建 bean 實(shí)例時(shí)可以自動(dòng)將這些屬性值注入到 bean 中。
例如,在上面提到的配置中,使用了 <property>
元素設(shè)置了數(shù)據(jù)源的 URL、驅(qū)動(dòng)類(lèi)名、用戶(hù)名和密碼等屬性值。其基本結(jié)構(gòu)如下:
id 屬性指定了 bean 的唯一標(biāo)識(shí)符。
class 屬性指定了 bean 的類(lèi)型。
<property> 元素用于設(shè)置 bean 的屬性值,name 屬性指定了屬性名,value 屬性指定了屬性值。
使用 <property> 元素可以完成對(duì)各種類(lèi)型屬性的設(shè)置,例如基本數(shù)據(jù)類(lèi)型、引用類(lèi)型(如其他 bean)、集合類(lèi)型等。
5. IoC具體容器實(shí)現(xiàn)選擇ClassPathXmlApplicationContext對(duì)象
在 Spring 中,IoC 容器是負(fù)責(zé)實(shí)例化、配置和組裝 bean 的核心容器。ClassPathXmlApplicationContext 是 Spring 提供的 IoC 容器實(shí)現(xiàn)之一,它從類(lèi)路徑下的 XML 配置文件中讀取配置信息,并根據(jù)配置創(chuàng)建相應(yīng)的 bean 實(shí)例
如圖:
實(shí)現(xiàn)方式:
- 優(yōu)點(diǎn):XML配置方式提供了清晰的、結(jié)構(gòu)化的方式來(lái)描述Bean之間的依賴(lài)關(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的類(lèi)和進(jìn)行屬性裝配
2. xml文件依然需要,需要通過(guò)<context:component-scan標(biāo)簽指定注解范圍
3. 標(biāo)記IoC注解:@Component,@Service,@Controller,@Repository
- @Component:
- 這是最通用的Spring組件注解,標(biāo)識(shí)一個(gè)類(lèi)為Spring組件。被
@Component
注解的類(lèi)將會(huì)作為候選組件被Spring的上下文進(jìn)行掃描和自動(dòng)配置。 - 它不攜帶任何特殊的語(yǔ)義信息,僅僅表明該類(lèi)是一個(gè)Spring組件。
- 這是最通用的Spring組件注解,標(biāo)識(shí)一個(gè)類(lèi)為Spring組件。被
- @Service:
- 用于標(biāo)識(shí)業(yè)務(wù)邏輯層的組件(如服務(wù)類(lèi))。
@Service
是@Component
的一個(gè)特殊化版本,它提供了更加明確的語(yǔ)義,表明這個(gè)類(lèi)是一個(gè)服務(wù)組件。- 通常,服務(wù)層負(fù)責(zé)實(shí)現(xiàn)業(yè)務(wù)邏輯,調(diào)用數(shù)據(jù)訪(fǎng)問(wèn)層(由
@Repository
標(biāo)識(shí)的組件)來(lái)獲取數(shù)據(jù),并可能將結(jié)果傳遞給表示層(由@Controller
標(biāo)識(shí)的組件)。
- @Controller:
- 用于標(biāo)識(shí)Web應(yīng)用中的控制器組件。
@Controller
是@Component
的一個(gè)特殊化版本,用于處理HTTP請(qǐng)求,通常與Spring MVC一起使用。- 在控制器中,你可以定義方法來(lái)處理特定的HTTP請(qǐng)求,并返回視圖名稱(chēng)或響應(yīng)體。
- @Repository:
- 用于標(biāo)識(shí)數(shù)據(jù)訪(fǎng)問(wèn)層的組件(如DAO類(lèi))。
@Repository
是@Component
的一個(gè)特殊化版本,它提供了更加明確的語(yǔ)義,表明這個(gè)類(lèi)是一個(gè)數(shù)據(jù)訪(fǎng)問(wèn)組件。- 在數(shù)據(jù)訪(fǎng)問(wèn)層,你可以定義方法來(lái)訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)、執(zhí)行CRUD操作等。
- Spring提供了額外的異常轉(zhuǎn)換功能,可以將來(lái)自數(shù)據(jù)訪(fǎng)問(wèn)層的異常轉(zhuǎn)換為
DataAccessException
類(lèi)型的異常,這使得開(kāi)發(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è)相同類(lèi)型的bean,Spring將不知道要注入哪一個(gè),這時(shí)就需要使用
@Qualifier
注解來(lái)指定要注入的bean的名稱(chēng)。 - 默認(rèn)情況下,
@Autowired
是必需的(即如果找不到匹配的bean,則會(huì)拋出異常)。但是,你可以通過(guò)@Autowired(required = false)
來(lái)指定注入是可選的。
- @Qualifier
@Qualifier
通常與@Autowired
一起使用,用于消除多個(gè)相同類(lèi)型bean的歧義。當(dāng)Spring容器中存在多個(gè)相同類(lèi)型的bean時(shí),你可以使用@Qualifier
注解來(lái)指定要注入的bean的名稱(chēng)。@Qualifier
可以用在方法、字段或構(gòu)造器參數(shù)的上面,但最常見(jiàn)的用法是結(jié)合@Autowired
一起使用在字段或setter方法上。
- @Resource
@Resource
是Java EE提供的注解,用于注入資源,如JavaBean、數(shù)據(jù)源等。在Spring中,它也可以用于自動(dòng)裝配bean。@Resource
可以指定要注入的bean的名稱(chēng)(通過(guò)name
屬性)或類(lèi)型(通過(guò)type
屬性)。如果同時(shí)指定了name
和type
,Spring將首先按name
查找,然后按type
查找。@Resource
的一個(gè)優(yōu)點(diǎn)是,即使沒(méi)有匹配的bean,它也不會(huì)拋出異常(這取決于@Resource
的具體用法和配置)。
- @Value
@Value
注解用于注入SpEL(Spring Expression Language)表達(dá)式、屬性文件中的值或字面量值。- 你可以使用
@Value
來(lái)注入基本類(lèi)型、字符串、其他bean的屬性或SpEL表達(dá)式的結(jié)果。 - 例如,你可以使用
@Value("${some.property}")
來(lái)注入屬性文件中的值,或者使用@Value("#{someBean.someProperty}")
來(lái)注入其他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):過(guò)度使用注解可能會(huì)導(dǎo)致代碼混亂和難以維護(hù)。此外,注解配置不如XML配置直觀(guān),可能需要更多的時(shí)間來(lái)學(xué)習(xí)和理解。
3 配置類(lèi)方式管理
1. 完全注解方式指的是去掉xml文件,使用配置類(lèi) + 注解實(shí)現(xiàn)
2. xml文件替換成使用@Configuration注解標(biāo)記的類(lèi)
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ì)象
配置類(lèi):
調(diào)用:
- 優(yōu)點(diǎn):JavaConfig配置方式使用Java類(lèi)來(lái)定義Bean及其依賴(lài)關(guān)系,這使得配置更加類(lèi)型安全,并且易于使用IDE的功能(如自動(dòng)補(bǔ)全和重構(gòu))。此外,JavaConfig配置支持在運(yùn)行時(shí)動(dòng)態(tài)地修改配置,并且可以與XML和注解配置混合使用。
- 缺點(diǎn):JavaConfig配置需要編寫(xiě)額外的Java代碼來(lái)定義Bean和依賴(lài)關(guān)系,這可能會(huì)增加項(xiàng)目的復(fù)雜性。此外,JavaConfig配置可能不如XML配置直觀(guān),特別是對(duì)于初學(xué)者來(lái)說(shuō)。
以上就是Spring IOC 三種配置方式詳解的詳細(xì)內(nèi)容,更多關(guān)于Spring IOC配置的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
IDEA中maven依賴(lài)報(bào)紅的問(wèn)題解決辦法
這篇文章主要給大家介紹了關(guān)于IDEA中maven依賴(lài)報(bào)紅的問(wèn)題解決辦法,在使用IDEA過(guò)程中,經(jīng)常會(huì)出現(xiàn)maven依賴(lài)報(bào)紅的問(wèn)題,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-07-07Maven配置倉(cāng)庫(kù)、阿里云鏡像、環(huán)境變量(史上最全)
本文主要介紹了Maven配置倉(cāng)庫(kù)、阿里云鏡像、環(huán)境變量,文中通過(guò)圖文示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-07-07RabbitMQ消息隊(duì)列中的Channel信道參數(shù)詳解
這篇文章主要介紹了RabbitMQ消息隊(duì)列中的Channel信道參數(shù)詳解,信道是生產(chǎn)消費(fèi)者與rabbit通信的渠道,生產(chǎn)者publish或者消費(fèi)者消費(fèi)一個(gè)隊(duì)列都是需要通過(guò)信道來(lái)通信的,信道是建立在TCP上面的虛擬鏈接,需要的朋友可以參考下2023-08-08java連接mysql數(shù)據(jù)庫(kù)實(shí)現(xiàn)單條插入和批量插入
這篇文章主要為大家詳細(xì)介紹了java連接mysql數(shù)據(jù)庫(kù)實(shí)現(xiàn)單條插入和批量插入,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08java使用泛型實(shí)現(xiàn)棧結(jié)構(gòu)示例分享
泛型是Java SE5.0的重要特性,使用泛型編程可以使代碼獲得最大的重用。由于在使用泛型時(shí)要指明泛型的具體類(lèi)型,這樣就避免了類(lèi)型轉(zhuǎn)換。本實(shí)例將使用泛型來(lái)實(shí)現(xiàn)一個(gè)棧結(jié)構(gòu),并對(duì)其進(jìn)行測(cè)試2014-03-03mybatis批量添加,批量更新之前如何判斷是否已經(jīng)存在
這篇文章主要介紹了mybatis批量添加,批量更新之前如何判斷是否已經(jīng)存在,具有很好的參考價(jià)值,希望對(duì)的有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08