Spring?In?Action研學記錄?-?第3、4章

第三章

spring自帶4種類型的裝配方式:按照bean的屬性名稱自動裝配bean(byName)、按照bean的屬性類型自動裝配bean(byType)、按照與bean構(gòu)造器入?yún)⒕哂邢嗤愋妥詣友b配bean(constructor)和按照構(gòu)造器和屬性類型的先后順序自動裝配bean(autodetect)

byName方式裝配的缺點:bean的名稱要和要裝配的bean屬性的名稱一致

byType方式裝配的缺點:如果找到多個與待裝配的bean的類型都一樣,spring會因為不知道該裝配哪一個bean而拋出異常??梢允褂?lt;bean>元素的primary屬性來設(shè)置首選bean,可以使用<bean>元素的autowire-candidate屬性來設(shè)置在自動裝配時排除哪些bean

constructor方式裝配的缺點:和byType方式一樣,找到多個合適得bean,會因為不知道到底要裝配哪一個bean而拋異常

spring默認設(shè)置自動裝配為none(即default-autowire屬性值為none),即所有bean都不進行自動裝配

設(shè)置default-autowire為某個值時,并不是設(shè)置了應(yīng)用上下文中的所有bean都是對應(yīng)的裝配方式,而是僅對設(shè)置的當前配置文件中的所有bean的裝配方式為指定的裝配方式

自動裝配和手動顯式裝配可以混用

spring默認關(guān)閉注解式裝配。使用<context:annotation-config>來啟用

spring支持常用的@Autowired、@Inject和@Resource注解來實現(xiàn)自動裝配

@Autowired可以寫在構(gòu)造方法、普通方法和私有變量上,但是必須保證只能找到一個與之匹配的bean,否則spring會因為不知道裝配哪一個bean而拋異常。同時它還有個額外的屬性-required,設(shè)置為false則當找不到要裝配得bean時不至于拋異常,而是設(shè)置為null

@Autowired可以配合@Qualifier使用byName的裝配方式來縮小裝配的范圍

@Inject是在Java中標準的注解,可以和spring中的@Autowired注解等價互換。只不過@Inject要求要裝配的bean一定要存在,否則會拋異常

spring中的@Autowired可以配合@Qualifier限定裝配范圍以更精確更適合的進行裝配,那么Java中的@Inject也可以配合@Named限定。@Named使用bean的id進行限定

第二張中提到的spEL,在使用@Value注解來注入簡單值時,也可用spEL的特性。如:動態(tài)計算

使用<context:component-scan>元素代替<context:annotation-config>,同時具有自動掃描檢測bean和開啟注解式的裝配方式

使用@Configuration注解就等同于在XML配置文件中的配置的<beans>根元素,表示是一個bean的配置集合

使用注解創(chuàng)建一個bean時,當前bean又依賴另外一個bean才能成功創(chuàng)建,則調(diào)用另一個bean的方法即可。但實際上在默認情況下,spring仍會返回此bean的同一個實例


總結(jié):

spring支持多種自動裝配得注解,比如Java中的@Inject

@Autowired、@Inject和@Resource注解都能實現(xiàn)自動裝配,但使用場景不同,不能用錯場景

@Value注解中也能使用spEL表達式


第四章

分布于應(yīng)用中的多處功能,稱為橫切關(guān)注點

切點的定義會匹配通知要織入的n個連接點

通知和切點的結(jié)合,稱為切面。切面的工作,稱為通知

aop可以在不修改原有類的情況下,為其賦予新的行為和狀態(tài)(代理)

將切面應(yīng)用到目標對象來創(chuàng)建新的代理對象的過程,稱為織入

織入的時機分類:

編譯期 - 典型代表:AspectJ

類加載期 - 典型代表:AspectJ 5的LTW

運行期 - 典型代表:spring aop

spring是在運行期將切面織入spring管理的bean中的。代理類封裝了目標類,并攔截被通知方法的調(diào)用,再講調(diào)用轉(zhuǎn)發(fā)給真正的bean

只有在使用applicationcontext,從bean工廠加載bean時才會創(chuàng)建bean的代理對象,否則一般只會在需要用到相關(guān)bean時,才會去創(chuàng)建代理對象

spring aop是一個功能弱化的aop的實現(xiàn),只支持方法級別的攔截,且也不支持構(gòu)造器通知(Java的構(gòu)造方法很特殊,spring的aop功能較弱無法支持bean創(chuàng)建前后的通知)。如果不滿足則需要配合AspectJ來實現(xiàn)高級aop

使用<aop:aspect>元素定義切面,使用<aop:config>元素標示配置是頂層的aop配置

使用環(huán)繞通知時,建議一定要調(diào)用ProceedingJointPoint對象的proceed()方法,如果不調(diào)用,則將不會調(diào)用目標方法

spring自帶了自動代理創(chuàng)建類,只要在XMLw配置文件中應(yīng)用<aop:aspectj-autoproxy />元素即可開啟,他會自動代理bean,且這些bean要配合使用@Aspect注解

雖然類被配置成了切面,但同時也可以正常地裝配成普通的bean來使用


總結(jié):

aop有很多廠商的實現(xiàn),spring自己也實現(xiàn)了一套,是基于方法的

spring aop在一般情況下,只有當用到bean時才回去創(chuàng)建它的代理

spring aop是在運行時aop容器為代理的bean自動創(chuàng)建代理對象,是動態(tài)代理,它不需要特殊的編譯器來織入切面。而aspectj是編譯期,故需要編譯器支持來織入

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容