国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

spring動態(tài)代理失效,AOP失效,事務(wù)@Transactional失效原因

這篇具有很好參考價值的文章主要介紹了spring動態(tài)代理失效,AOP失效,事務(wù)@Transactional失效原因。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

事務(wù)基于@Transactional注解和AOP(動態(tài)代理)

1. 動態(tài)代理失效

對于基于接口動態(tài)代理的 AOP 事務(wù)增強來說,由于接口的方法都必然是 public 的,這就要求實現(xiàn)類的實現(xiàn)方法也必須是 public 的(不能是 protected、private 等),同時不能使用 static 的修飾符。所以,可以實施接口動態(tài)代理的方法只能是使用 public 或 public final 修飾符的方法,其他方法不可能被動態(tài)代理,相應(yīng)的也就不能實施 AOP 增強,換句話說,即不能進行 Spring 事務(wù)增強了。

基于 CGLib 字節(jié)碼動態(tài)代理的方案是通過擴展被增強類,動態(tài)創(chuàng)建其子類的方式進行 AOP 增強植入的。由于使用 final、static、private 修飾符的方法都不能被子類覆蓋,相應(yīng)的,這些方法將無法實施 AOP 增強。所以方法簽名必須特別注意這些修飾符的使用,以免使方法不小心成為事務(wù)管理的漏網(wǎng)之魚。

2. AOP失效

第一種(要增強的類或方法沒被spring管理)
對于傳統(tǒng)的web項目來說,通常使用spring和springmvc,因此對于這種項目來講,他是有兩個容器的,一個是spring容器,一般我們會把Service層的東西注入到spring容器中,另一個是springmvc的容器,通常這個容器里注入的是Controller層的東西,這里我們認為spring容器是父容器,springmvc是子容器的概念,然后我們大家都知道通過父子繼承關(guān)系可知,子容器是可以讀取到父容器中的東西,但是父容器是無法讀到子容器中的內(nèi)容,因此基于這個場景,有的同學,把Aop的實現(xiàn)類注入到了spring容器中,并且將Aop的切點表達式配置aop:config <aop:pointcut的execution也配到了spring容器的xml,而巧了這位同學要切的類方法,正好是Controller,也就是springmvc容器中的東西,那么這時候問題就來了,aop在初始化時會在自己的容器中尋找能夠匹配的類方法,然后給他套上一層代理,此時他在自己能夠訪問到的spring容器中根本找不到與之匹配的類和方法,因為這些類和方法是在springmvc容器中管理的,因此就沒有代理成功
解決:那么對于上述問題要怎么修改呢?只需要確保你要Aop切的類和方法與你Aop配置切點aop:config <aop:pointcut的execution表達式聲明是在同一個容器中即可,此時只需要將這個配置移到springmvc容器的xml中即可

第二種(要被增強的類或方法同時被spring和springMVC掃描)
第二種情況與第一種情況有些許的類似,但并不相同,是關(guān)于重復(fù)掃描的,比如你在spring容器中配置了一個Aop,并且把他托管給spring容器管理,而且execution表達式切的也是spring容器中管理的類和方法,理論上這個時候是好用的,這批execution切到的類都被加了代理,但是巧了,springmvc容器中由于配置的是包路徑掃描,恰好把execution表達式切的這一批對象又掃了一遍,又都托管給了springmvc容器,而此時掃到的這批對象,是重新new出來交給springmvc管理的,因此并沒有被aop代理,所以在使用時,注入進來的可能是springmvc容器管理的這批對象,因此使用時發(fā)現(xiàn)Aop代理失效了
解決:這個問題的解決方案,就是避免兩個容器重復(fù)掃描。

第三種(要增強的方法被同類的方法調(diào)用)
第三個問題就比較簡單了,他的現(xiàn)象是有些方法被Aop代理成功了,但有個別方法沒有代理成功,究其原因發(fā)現(xiàn)這部分沒有代理成功的方法并不是通過代理對象調(diào)用的,而是自身調(diào)用的,故被調(diào)用的方法沒有被Aop代理,無法織入橫切邏輯。
解決:舉個栗子,比如A.a(),A.b()是被代理的類和方法,那么當我調(diào)用A.a()時,此時a被代理了,成功執(zhí)行代理類的內(nèi)容,但還沒有完,a()方法中調(diào)用了自身的方法b(),此時我們以為b也會被代理類代理,但實際上并沒有,因為他是自身方法調(diào)用了并不是通過代理類A調(diào)用的,在a方法中可以通過((A) AopContext.currentProxy()).b()調(diào)用,不過前提是配置上<aop:config expose-proxy=“true”>,expose-proxy="true"是重點(先開啟cglib代理,開啟 exposeProxy = true,暴露代理對象)

第四種(用的注解方式?jīng)]有開啟注解支持)
這種就更好理解了,只需要開啟注解支持就行了。
xml方式開啟在spring配置文件添加上aop:aspectj-autoproxy/即可
注解方式開啟在啟動類上添加@EnableAspectJAutoProxy即可

總結(jié)
第一種和第二種是因為MVC分層沒有用好,接收數(shù)據(jù)和業(yè)務(wù)邏輯要分開,
第三種是因為代理模式限制
第四種就是使用不當了

3. @Transactional失效

事務(wù)基于注解和AOP,注解失效和AOP失效
原因一:沒有開啟事務(wù)管理
原因二:標注了@Transactional的方法里面的異常被捕獲了
原因三:標注了@Transactional的方法發(fā)生了非Error 或者 非RuntimeException
原因四:標注了@Transactional的方法的事務(wù)傳播類型propagation配置成了NOTSUPPORT
原因五:標注了@Transactional的方法的事務(wù)傳播類型propagation配置成了NEVER
原因六:標注了@Transactional的方法的事務(wù)傳播類型propagation配置成了SUPPORTS且當前沒有事務(wù)
原因七:外部調(diào)用方法A,A內(nèi)部調(diào)用方法B,A沒有@Transaction注解而B有@Transactional注解
原因九:標注了@Transactional的方法不是public的
原因十:標注了@Transactional的方法發(fā)生的異常不是rollbackFor指定的類型或子類
原因十一:數(shù)據(jù)庫不支持事務(wù)文章來源地址http://www.zghlxwxcb.cn/news/detail-551591.html

到了這里,關(guān)于spring動態(tài)代理失效,AOP失效,事務(wù)@Transactional失效原因的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Spring | Srping AOP (AOP簡介、動態(tài)代理、基于“代理類”的AOP實現(xiàn))

    Spring | Srping AOP (AOP簡介、動態(tài)代理、基于“代理類”的AOP實現(xiàn))

    作者簡介 :一只大皮卡丘,計算機專業(yè)學生,正在努力學習、努力敲代碼中! 讓我們一起繼續(xù)努力學習! 該文章 參考學習教材 為: 《Java EE企業(yè)級應(yīng)用開發(fā)教程 (Spring + Spring MVC +MyBatis)》 黑馬程序員 / 編著 文章以課本知識點 + 代碼為主線,結(jié)合自己看書學習過程中的理解和

    2024年01月22日
    瀏覽(19)
  • 動態(tài)代理與Spring Aop

    動態(tài)代理與Spring Aop

    JDK 動態(tài)代理 使用JAVA反射包中的類和接口實現(xiàn)動態(tài)代理的功能,JAVA.lang.reflect包;主要是三個類: InvocationHandler,Method,Proxy; CGLIB動態(tài)代理,第三方工具類庫,創(chuàng)建代理對象,cglib的原理是繼承,通過繼承目標類,創(chuàng)建它的子類,在子類中重寫父類中同名的方法,實現(xiàn)功能的修改

    2024年02月11日
    瀏覽(21)
  • 面試好題:@Transactional聲明式事務(wù)注解什么時候會失效?

    面試好題:@Transactional聲明式事務(wù)注解什么時候會失效?

    今天來分享一道比較有意思的面試題,“@Transactional聲明式事務(wù)注解什么時候會失效?”。 對于這個問題,我們一起看看考察點和比較好的回答吧! ????這個問題就是面試官想考察我們對@Transactional注解有沒有深刻的認識,以及日常開發(fā)中是否善于積累,認真思考。 下面我

    2024年02月09日
    瀏覽(23)
  • 設(shè)計模式 代理模式(靜態(tài)代理 動態(tài)代理) 與 Spring Aop源碼分析 具體是如何創(chuàng)建Aop代理的

    設(shè)計模式 代理模式(靜態(tài)代理 動態(tài)代理) 與 Spring Aop源碼分析 具體是如何創(chuàng)建Aop代理的

    代理模式是一種結(jié)構(gòu)型設(shè)計模式,它通過創(chuàng)建一個代理對象來控制對真實對象的訪問。這種模式可以用于提供額外的功能操作,或者擴展目標對象的功能。 在代理模式中,代理對象與真實對象實現(xiàn)相同的接口,以便在任何地方都可以使用相同的接口來調(diào)用真實對象的方法。這

    2024年01月20日
    瀏覽(30)
  • spring的aop動態(tài)代理對象注入時機

    spring的aop動態(tài)代理對象注入時機

    bean生命周期: bean實例化 populateBean填充屬性 invokeAwareMethods調(diào)用aware方法 postProcessBeforeInitialization后置處理器before方法 initializeBean初始化bean postProcessAfterAfterInitialization后置處理器after方法 代理對象注入有兩種情況:提前和非提前生成代理對象 1. 非提前生成代理對象 依賴于bea

    2024年02月12日
    瀏覽(21)
  • Spring Boot 中的 AOP,到底是 JDK 動態(tài)代理還是 Cglib 動態(tài)代理

    Spring Boot 中的 AOP,到底是 JDK 動態(tài)代理還是 Cglib 動態(tài)代理

    大家都知道,AOP 底層是動態(tài)代理,而 Java 中的動態(tài)代理有兩種實現(xiàn)方式: 基于 JDK 的動態(tài)代理 基于 Cglib 的動態(tài)代理 這兩者最大的區(qū)別在于基于 JDK 的動態(tài)代理需要被代理的對象有接口,而基于 Cglib 的動態(tài)代理并不需要被代理對象有接口。 那么,Spring 中的 AOP 是怎么實現(xiàn)的

    2024年02月12日
    瀏覽(24)
  • Spring AOP 學習(動態(tài)代理、JdbcTemplate、Junit)

    Spring AOP 學習(動態(tài)代理、JdbcTemplate、Junit)

    Proxy? jdk動態(tài)代理,面向接口 cglib? ?第三方動態(tài)代理,面向父類 在 不修改原有代碼 ,或者沒有辦法修改原有代碼的情況下, 增強對象功能 ,使用代理對象代替原來的對象去完成功能,進而達到拓展功能的目的 JDK Proxy 動態(tài)代理是 面向接口 的動態(tài)代理,一定要有接口和實現(xiàn)

    2024年02月08日
    瀏覽(25)
  • 54.Spring的AOP是在哪里創(chuàng)建的動態(tài)代理?

    正常的Bean會在Bean的生命周期的‘初始化’后, 通過BeanPostProcessor.postProcessAfterInitialization創(chuàng)建aop的動態(tài)代理 還有一種特殊情況: 循環(huán)依賴的Bean會在Bean的生命周期‘屬性注入’時存在的循環(huán)依賴的情況下, 也會為循環(huán)依賴的Bean 通過MergedBeanDefinitionPostProcessor.postProcessMergedBe

    2024年02月02日
    瀏覽(16)
  • JDK 動態(tài)代理(Spring AOP 的原理)(面試重點)

    JDK 動態(tài)代理(Spring AOP 的原理)(面試重點)

    ????????也叫委托模式.定義:為其他對象提供?種代理以控制對這個對象的訪問.它的作?就是通過提供?個代理類,讓我們 在調(diào)??標?法的時候,不再是直接對?標?法進?調(diào)?,?是通過代理類間接調(diào)?,在某些情況下,?個對象不適合或者不能直接引?另?個對象,?代

    2024年01月22日
    瀏覽(43)
  • Spring的事務(wù)(@Transactional)

    Spring事務(wù)的本質(zhì),其實就是通過 Spring AOP 切面技術(shù) Spring事務(wù)支持2種使用方式 聲明式事務(wù)(注解方式) 編程式事務(wù)(代碼方式):代碼需要手動控制,比較繁瑣,一般不使用 SpringBoot 默認開啟了事務(wù) Spring Spring的事務(wù)是使用AOP來實現(xiàn)的,在執(zhí)行目標方法的前和后,加上了事務(wù)

    2024年02月21日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包