




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、 請不要再使用低級別的 AOP API * spring 雜談 sp ringa op shiro 在iteye上,咨詢我Spring問題中最多的一個就是: AOP方面的問題,我之前也寫過類似 的帖子解答那些疑問: 注入 FactoryBean 失敗分析 +解決方案 spring的二次代理原因及如何排查 struts2+spring 集成 bug使用 AOP 時可能遇到的問題分析 關(guān)于 spring 的 aop 攔截的問題 protected 方法代理問題 Spring事務(wù)不起作用問題匯總 Shiro+Struts2+Spring3 力上 RequiresPermissions 后 Autow
2、ired 失效 女D何為spring代理類設(shè)置屬性值 在spring中獲取代理對象代理的目標(biāo)對象工具類 Spring事務(wù)處理時自我調(diào)用的解決方案及一些實(shí)現(xiàn)方式的風(fēng)險 大家有興趣可以參考我的java開發(fā)常見問題分析 分類。里邊收集了許多在開發(fā)過程中 我遇到的或別人遇到的問題。 其中最主要的問題一方面是我們使用問題,另一方面是其他原因(比如bug、設(shè)計缺陷等)。 Spring已經(jīng)太龐大了,大的連我這個熟手有時候都載了。 所以我想做一件事情: 那些年我們 很希望大家遇到問題時能反饋給我,我做個收集,方便后來人。點(diǎn)擊這前往 遇到的各種坑 當(dāng)然spring還是足夠好的,只討論問題,不討論其他。 出問題的
3、配置 1. Java 代碼 I,- vbean class =org.springframework.aop.aspectj.autoproxy.AspectJAwareAdvisorAu toP roxyCreator 2. 3. vprop erty name= p roxyTargetClass value= true / 4. 此配置的目的是想進(jìn)行cglib類代理。但是實(shí)際上當(dāng)進(jìn)行直接注入類,而不是接口時會找不 到Bean錯誤。 但是如果是這樣配置: Java代碼 1. 2. 此配置可以很好的工作,并注入類(不是接口)。 分析 1、 該命名空間會交給 org.s prin gframe
4、work.a op.con fig.A opN ames paceHa ndler 處理: Java 代碼 asp ectj-aut op roxy 1.registerBeanDefinitio nP arser( ,new Asp ectJAut oP roxyBeanDe finitio nP arser(); 在 AspectJAutoProxyBeanDefinitionParser 中,會執(zhí)行 parse方法解析配置: Java代碼 1. p ublicBeanDefinition p arse(Element element, ParserContext p arserConte
5、x t) 2. Aop Names paceUtils.registerAs pectJAnnotationAut oP roxyCreatorIfNecessary (p arserContext, element); 3. extendBeanDefinition(element, p arserContext); 4. return null ; 其中 AopN ames paceUtils.registerAs pecJA nno tati on Aut oP roxyCreatorlfNecessary (p arserC ont ext, element);目的是注冊 Annota
6、tionAwareAspecJAutoProxyCreator Java代碼 1. returnregisterOrEscalateA pcAsRequired(AnnotationAwareAs pecJAut oP roxyCreato r. class , registry, source); 但是注意了: Java代碼 1. if (registry.containsBeanDefinition(AUTO_PROXY_CREATOR_BEAN_NAME) 2. BeanDefinition ap cDefinition = registry.getBeanDefinition(AUTO
7、_ PROXY_CRE 3. ATOR_BEAN_NAME); if (!cls.getName().equals(apcDefinition.getBeanClassName() 4. int current Priority = find PriorityForClass(a pcDefinition.getBeanClas 5. sName(); int required Priority = find PriorityForClass(cls); 6. if (current Priority required Priority) 7. 8. ap cDefinition.setBea
8、nClassName(cls.getName(); 9. 10. return null ; 11. 大家可以看到一句話: if (registry.co ntai nsBea nDefin itio n(AUTO_ PROXY_CREATOR_BEAN_NAME) AUTO_ PROXY_CREATOR_BEAN_NA“Eorg.s prin gframework.ao p.con fig.i nterna lAutoProxyCreator,” 即首先判斷當(dāng)前容器中是否包含名字為 AUTO_ PROXY_CREATOR_BEAN_NAME Bean ,如果包含:然后判斷優(yōu)先級,誰優(yōu)先級高誰
9、獲勝,即最后那個獲勝的是實(shí)際的 Aut oP roxyCreator 到此我們可以看到跟配置沒什么區(qū)別,除了沒有名字外。 處理: 2、接下來看一下 該命名空間交給 org.s prin gframework.tra nsaction.con fig.TxNames paceHa ndler Java代碼 h 1.registerBeanDefinitio nP arser( annotation-driven ,new AnnotationDrivenBeanDe finitio nP arser(); 其中 會交給 AnnotationDrivenBeanDefinitionParser 進(jìn)
10、行解析: Java代碼 1. p ublicBeanDefinition p arse(Element element, P arserContext p arserContex t) 2. String mode = element.getAttribute( mode); 3. if ( aspectj .equals(mode) 4. 5. / mode=as pectj registerTransactionAs pect(element, p arserContext); 6. 7. 8. else / mode=p roxy 9. Aop Aut oP roxyConfigurer
11、.configureAut oP roxyCreator(element, p arserCont ext); 10. 11. return null ; 12. 默認(rèn) mode=proxy,所以走 AopAutoProxyConfigurer.configureAutoProxyCreator ,其代 碼中第一句話是: Java代碼 1. Aop Names paceUtils.registerAut oP roxyCreatorIfNecessary (p arserContext, elemen t); Java代碼 1. 2. publicstatic void registerAut
12、oProxyCreatorIfNecessary( P arserContext p arserContext, Element sourceElement) 3. 4. BeanDefinition beanDefinition = Aop ConfigUtils.registerAut oP roxyCrea torIfNecessary( 5. p arserContext.getRegistry(), p arserContext.extractSource(sou 6. rceElement); useClass ProxyinglfNecessary (p arserContext
13、.getRegistry(), sourceEleme nt); 7. registerC ompo nentlfNecessary(beanDefinition, p arserContext); AopCon figUtils.registerAut oP roxyCreatorIfNecessary 是: 1.registerOrEscalateA pcAsRequired(lnfrastructureAdvisorAut oP roxyCreator. clas s, registry, source); 8. 1. 2. p rivatestatic BeanDefinition r
14、egisterOrEscalateA pcAsRequired(Class cls, Bea nDefinitionRegistry registry, Object source) Assert.notNull(registry,BeanDefinitionRegistry must not be null -); 3. if (registry.containsBeanDefinition(AUTO_ PROXY_CREATOR_BEAN_NAM 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. E) BeanDefinition ap cDefinition =
15、 registry.getBeanDefinition(AUTO _P ROXY_CREATOR_BEAN_NAME); if (!cls.getName().equals(apcDefinition.getBeanClassName() int current Priority = find PriorityForClass(a pcDefinition.get BeanClassNameO); int required Priority = find PriorityForClass(cls); if (current Priority required Priority) ap cDef
16、inition.setBeanClassName(cls.getName(); return null / 省略 此處我們又看到了 registry.co ntai nsBea nDefi nitio n(AUTO_ PROXY_CREATOR_BEAN_NAME) ,如果是: 配置1, 那么實(shí)際是兩個 Aut oP roxyCreator 配置2, 那么實(shí)際是共用一個Aut oP roxyCreator ; 而且如果配置 1時,因?yàn)槲覀儧]有指定所以是JDK動 態(tài)代理,因此不管怎么樣,都無法注入類的。 問題找到了,原因是注冊了兩個 Auto Proxycreator ,造成了二次代理引發(fā)的問題
17、, 這個和 之前的spring 的二次代理原因及如何排查一樣。 如果解決 給配置 1 起名字為 ” ernalAutoProxyCreator 或者使用配置2 建議 1、如果沒有必要,請不要使用低級別 API,如上述- 自己去創(chuàng)建 AutoProxyCreator 2、首先選擇使用如: 如上配置已經(jīng)非常好了,根本沒必要使用低級別 API。 如使用的 AutoProxyCreator 都是和上邊是一樣的。這樣還能防止二 次代理。 API,請不要再使用 聲明式/AspecJ風(fēng)格的AOP都非常好了,完全沒必要使用低級別 低級別API 了。 如果用過shiro的朋友都應(yīng)該知道如下配置: . L ifi Java代碼I i 1. !- Enable Shiro Annotations for Spring-configured beans. Only run after - 2. !- the lifecycleBea nP rocessor has run:
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 企業(yè)合同范本制作
- 口才教室出租合同范本
- 企業(yè)采購合作合同范例
- 以物抵債合同范本
- 冷凍品購銷合同范例
- 合唱排練協(xié)議合同范本
- 周口市安置房買賣合同范例
- 品牌店 轉(zhuǎn)讓 合同范本
- 廠房買賣合同范本模板
- 廚師人工合同范本
- 腫瘤心臟病學(xué)培訓(xùn)課件
- 開展健康生活方式、營養(yǎng)和慢性病預(yù)防知識教育和宣傳活動
- 新編英語語法教程第六版課后答案全
- 2人退伍老兵表演軍人小品《照相》臺詞
- 性傳播疾病-課件
- 最新《橋梁工程》梁式橋和板式橋設(shè)計課件
- 無人機(jī)學(xué)習(xí)文件-飛行手冊
- 典范英語教材-1a-課件
- 2023年揚(yáng)州市職業(yè)大學(xué)單招職業(yè)適應(yīng)性測試筆試題庫及答案解析
- 供銷聯(lián)社審計:問題發(fā)現(xiàn)與整改情況報告
- 昆醫(yī)大康復(fù)治療技術(shù)課件09運(yùn)動想象療法
評論
0/150
提交評論