Spring注解實(shí)現(xiàn)自動(dòng)裝配過(guò)程解析
在IOC容器中學(xué)習(xí)相關(guān)注解(常用)
1. @Autowireda.作用對(duì)象:(官網(wǎng)解釋)
1. You can apply the @Autowired annotation to constructors:
2.you can also apply the @Autowired annotation to "traditional" setter methods:
3.You can also apply the annotation to methods with arbitrary names and/or multiple arguments:
4.You can apply @Autowired to fields as well and even mix it with constructors:
5.It is also possible to provide all beans of a particular type from the ApplicationContext by adding the annotation to a field or method that expects an array of that type:
6.Even typed Maps can be autowired as long as the expected key type is String. The Map values will contain all beans of the expected type, and the keys will contain the corresponding bean names:等
總結(jié)一下就是: 可以在構(gòu)造器,set方法,任意方法和屬性上,數(shù)組上,String類(lèi)型的Map上等。
Notes:1.@Autowired默認(rèn)按類(lèi)型裝配(這個(gè)注解是屬業(yè)spring的),默認(rèn)情況下必須要求依賴(lài)對(duì)象必須存在,如果要允許null值,可以設(shè)置它的required屬性為false。
2.可以與@qualifier 共同使用, 當(dāng)對(duì)象類(lèi)型和名字發(fā)生沖突時(shí),該注解可用于指定特定的對(duì)象。
@Autowired()
@Qualifier("cat")
可以找到id="cat"的beanb.功能:它可以對(duì)類(lèi)成員變量、方法及構(gòu)造函數(shù)進(jìn)行標(biāo)注,完成自動(dòng)裝配的工作。通過(guò) @Autowired的使用來(lái)消除 set ,get方法。2.@Resourcea.功能: @Resource的作用相當(dāng)于@Autowired,只不過(guò)@Autowired按byType自動(dòng)注入,而@Resource默認(rèn)按 byName自動(dòng)注入
@Resource有兩個(gè)屬性是比較重要的,分是name和type,Spring將@Resource注解的name屬性解析為bean的名字,而type屬性則解析為bean的類(lèi)型。所以如果使用name屬性,則使用byName的自動(dòng)注入策略,而使用type屬性時(shí)則使用byType自動(dòng)注入策略。如果既不指定name也不指定type屬性,這時(shí)將通過(guò)反射機(jī)制使用byName自動(dòng)注入策略。
3.@Requireda.功能:@Required 注釋?xiě)?yīng)用于 bean 屬性的 setter 方法,它表明受影響的 bean 屬性在配置時(shí)必須放在 XML 配置文件中,否則容器就會(huì)拋出一個(gè) BeanInitializationException 異常。下面顯示的是一個(gè)使用 @Required 注釋的示例。
這有一個(gè)很好的解釋和例子關(guān)于@Required注解
使用@Autowired后的優(yōu)點(diǎn)
原來(lái)我們需要手動(dòng)注入之后才可以使用employee對(duì)象:
<bean> <property name="employee" ref="employee"/>
若沒(méi)有進(jìn)行手動(dòng)注入,不會(huì)從測(cè)試代碼中 獲取到employee對(duì)象。
使用@Autowired之后
不需要手動(dòng)注入。
<bean id="car" class="com.ding.pojo.Car"/>
只用在屬性上進(jìn)行@Autowired注釋標(biāo)注

在測(cè)試類(lèi)中即可直接調(diào)用:
public class MyTest {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Car car = (Car) context.getBean("car");
car.getOwner().MyEmployment();
}
}
系統(tǒng)首先根據(jù) bean中class類(lèi)型進(jìn)行確認(rèn),再和bean中id名進(jìn)行確認(rèn),最后確定所定的注入對(duì)象。 若多個(gè)bean 名字不同,且類(lèi)型相同則該注釋失效。(可使用@Qualifier 進(jìn)行唯一指定)
例如:
<bean id="owner22" class="com.ding.pojo.owner"/>
<bean id="owner11" class="com.ding.pojo.owner"/>
運(yùn)行相同代碼會(huì)報(bào)如下錯(cuò)誤:

此時(shí)加上@Qualifier注釋如下,代碼可正常編譯:

運(yùn)行結(jié)果:

如分享內(nèi)容中有問(wèn)題的地方,還望您多加指出,感謝您的瀏覽。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
java如何發(fā)送get請(qǐng)求獲取數(shù)據(jù)(附代碼)
這篇文章主要給大家介紹了關(guān)于java如何發(fā)送get請(qǐng)求獲取數(shù)據(jù)的相關(guān)資料,Java中的GET請(qǐng)求方法是HTTP協(xié)議中的一種請(qǐng)求方式,用于向服務(wù)器請(qǐng)求獲取資源,需要的朋友可以參考下2023-10-10
RocketMQ?Broker實(shí)現(xiàn)高可用高并發(fā)的消息中轉(zhuǎn)服務(wù)
RocketMQ消息代理(Broker)是一種高可用、高并發(fā)的消息中轉(zhuǎn)服務(wù),能夠接收并存儲(chǔ)生產(chǎn)者發(fā)送的消息,并將消息發(fā)送給消費(fèi)者。它具有多種消息存儲(chǔ)模式和消息傳遞模式,支持水平擴(kuò)展和故障轉(zhuǎn)移等特性,可以為分布式應(yīng)用提供可靠的消息傳遞服務(wù)2023-04-04
Java8接口中引入default關(guān)鍵字的本質(zhì)原因詳析
Default方法是在java8中引入的關(guān)鍵字,也可稱(chēng)為Virtual extension methods—虛擬擴(kuò)展方法,這篇文章主要給大家介紹了關(guān)于Java8接口中引入default關(guān)鍵字的本質(zhì)原因,需要的朋友可以參考下2022-01-01
Java通過(guò)JNI 調(diào)用動(dòng)態(tài)鏈接庫(kù)DLL操作
這篇文章主要介紹了Java通過(guò)JNI 調(diào)用動(dòng)態(tài)鏈接庫(kù)DLL操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11
Java中的CyclicBarrier循環(huán)柵欄詳解
這篇文章主要介紹了Java中的CyclicBarrier循環(huán)柵欄詳解,CyclicBarrier循環(huán)柵欄是用來(lái)進(jìn)行線程協(xié)作,等待線程滿(mǎn)足某個(gè)計(jì)數(shù),構(gòu)造時(shí)設(shè)置計(jì)數(shù)個(gè)數(shù),每個(gè)線程執(zhí)行到某個(gè)需要“同步”的時(shí)刻調(diào)用 await()方法進(jìn)行等待,當(dāng)?shù)却木€程數(shù)滿(mǎn)足計(jì)數(shù)個(gè)數(shù)時(shí),繼續(xù)執(zhí)行,需要的朋友可以參考下2023-12-12
Java數(shù)據(jù)結(jié)構(gòu)之LinkedList從鏈表到實(shí)現(xiàn)
LinkedList是Java中常用的數(shù)據(jù)結(jié)構(gòu)之一,實(shí)現(xiàn)了鏈表的特性,支持快速添加、刪除元素,可以用于實(shí)現(xiàn)隊(duì)列、棧、雙向隊(duì)列等數(shù)據(jù)結(jié)構(gòu)。LinkedList的內(nèi)部實(shí)現(xiàn)采用了雙向鏈表,其中每個(gè)節(jié)點(diǎn)都包含前驅(qū)節(jié)點(diǎn)和后繼節(jié)點(diǎn)的引用,可以直接訪問(wèn)鏈表的頭尾元素2023-04-04

