最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解決spring AOP中自身方法調(diào)用無法應(yīng)用代理的問題

 更新時間:2021年08月28日 14:59:00   作者:tangtong1  
這篇文章主要介紹了解決spring AOP中自身方法調(diào)用無法應(yīng)用代理的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

spring AOP中自身方法調(diào)用無法應(yīng)用代理

如下例

public class MyServiceImpl implements MyService {
 public void do(){
  //the transaction annotation won't work if you directly invoke handle() method with 'this'
  this.handle();
 }
 @Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class)
 public void handle() {
  //sth with transaction
 }
}

如果直接調(diào)用this的handle()方法則事務(wù)無法生效,原因是spring的AOP是通過代理實現(xiàn)的,像這樣直接調(diào)用本對象的方法是不會應(yīng)用代理的。

可以使用如下兩種方式修改代碼以應(yīng)用事務(wù)

(1)在MyServiceImpl中聲明一個MyService對象

public class MyServiceImpl implements MyService {
 @Autowired
 private MyService myService;
 
 public void do(){
  //use myService object
  myService.handle();
 }
 @Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class)
 public void handle() {
  //sth. with transaction
 }
}

(2)使用AopContext類

public class MyServiceImpl implements MyService {
 public void do(){
  //fetch current proxy objet from AopContext
  ((MyService)AopContext.currentProxy()).handle();
 }
 @Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class)
 public void handle() {
  //sth with transaction
 }
}

注意,原生的AspectJ是不會有這種自身調(diào)用的問題的,因為它不是基于代理的AOP框架。

spring aop 內(nèi)部方法調(diào)用事務(wù)不生效

方法1:

基于 proxy 的 spring aop 帶來的內(nèi)部調(diào)用問題可以使用 AopContext.currentProxy() 強轉(zhuǎn)為當(dāng)前的再調(diào)用就可以解決了

例如:

錯誤用法:

public Account getAccountByName2(String userName) {
  return this.getAccountByName(userName);
}

修改為:

public Account getAccountByName2(String userName) {
  return ((AccountService)AopContext.currentProxy()).getAccountByName(userName);
}

另外注意:要設(shè)置aop實體暴露出來。在springboot的application.java里面加上

@EnableAspectJAutoProxy(proxyTargetClass = true, exposeProxy = true)

方法2:

利用初始化方法在目標(biāo)對象中注入代理對象

在目標(biāo)對象類中注入spring上下文,通過context獲取代理對象,并調(diào)用代理對象的方法。

注意:該方案對于scope為prototype的bean無法適用,因為每次獲取bean時都返回一個新的對象。

方法2.1:

//延遲加載方式
private TestService testService;
@Autowired
@Lazy
public void setTestService(TestService testService) {
    this.testService = testService;
}

方法2.2:

import javax.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;
import com.blog.common.aop.service.TestService;
@Service
public class TestServiceImpl implements TestService {
    @Autowired
    private ApplicationContext context;
    private TestService proxyObject;
    @PostConstruct
    // 初始化方法,在IOC注入完成后會執(zhí)行該方法
    private void setSelf() {
        // 從spring上下文獲取代理對象(直接通過proxyObject=this是不對的,this是目標(biāo)對象)
        // 此種方法不適合于prototype Bean,因為每次getBean返回一個新的Bean
        proxyObject = context.getBean(TestService.class);
    }
    public void methodA() throws Exception {
        System.out.println("method A run");
        System.out.println("method A 中調(diào)用method B,通過注入的代理對象,調(diào)用代理對象的方法,解決內(nèi)部調(diào)用實現(xiàn)的問題。");
        proxyObject.methodB(); //調(diào)用代理對象的方法,解決內(nèi)部調(diào)用失效的問題
    }
    public void methodB() {
        System.out.println("method B run");
    }
}

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 解決java錯誤:不支持發(fā)行版本5

    解決java錯誤:不支持發(fā)行版本5

    這篇文章主要給大家介紹了關(guān)于如何解決java錯誤:不支持發(fā)行版本5的相關(guān)資料,發(fā)行版本5是Java5,已經(jīng)是十多年前的版本了,現(xiàn)在已經(jīng)不再被支持,需要的朋友可以參考下
    2023-07-07
  • SpringBoot開發(fā)技巧之使用AOP記錄日志示例解析

    SpringBoot開發(fā)技巧之使用AOP記錄日志示例解析

    這篇文章主要為大家介紹了SpringBoot開發(fā)技巧之如何利用AOP記錄日志的示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2021-10-10
  • Java數(shù)據(jù)結(jié)構(gòu)之散列表詳解

    Java數(shù)據(jù)結(jié)構(gòu)之散列表詳解

    散列表(Hash table,也叫哈希表),是根據(jù)關(guān)鍵碼值(Key value)而直接進行訪問的數(shù)據(jù)結(jié)構(gòu)。本文將為大家具體介紹一下散列表的原理及其代碼實現(xiàn)
    2022-01-01
  • Spring MVC Controller返回值及異常的統(tǒng)一處理方法

    Spring MVC Controller返回值及異常的統(tǒng)一處理方法

    這篇文章主要給大家介紹了關(guān)于Spring MVC Controller返回值及異常的統(tǒng)一處理方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者使用Spring MVC具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • Mybatis動態(tài)sql超詳細(xì)講解

    Mybatis動態(tài)sql超詳細(xì)講解

    動態(tài)SQL是MyBatis的強大特性之一,顧名思義就是會動的SQL,即是能夠靈活的根據(jù)某種條件拼接出完整的SQL語句,下面這篇文章主要給大家介紹了關(guān)于Mybatis動態(tài)sql的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • spring獲取bean的源碼解析

    spring獲取bean的源碼解析

    這篇文章主要介紹了spring獲取bean的源碼解析,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • SpringBoot內(nèi)置tomcat啟動原理詳解

    SpringBoot內(nèi)置tomcat啟動原理詳解

    這篇文章主要介紹了SpringBoot內(nèi)置tomcat啟動原理詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Java實現(xiàn)一個小說采集程序的簡單實例

    Java實現(xiàn)一個小說采集程序的簡單實例

    下面小編就為大家?guī)硪黄狫ava實現(xiàn)一個小說采集程序的簡單實例。小編覺得挺不錯的, 現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • SpringBoot 集成 Kettle的實現(xiàn)示例

    SpringBoot 集成 Kettle的實現(xiàn)示例

    本文主要介紹了SpringBoot 集成 Kettle的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-01-01
  • SpringBoot+Vue中的Token續(xù)簽機制

    SpringBoot+Vue中的Token續(xù)簽機制

    本文主要介紹了SpringBoot+Vue中的Token續(xù)簽機制,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-06-06

最新評論

铜川市| 和静县| 嵊泗县| 安义县| 黄骅市| 灵宝市| 屯留县| 泸水县| 武鸣县| 东光县| 栖霞市| 改则县| 敦化市| 九台市| 虞城县| 延安市| 香河县| 伊川县| 惠来县| 南溪县| 万山特区| 曲靖市| 阿图什市| 靖安县| 德格县| 河北省| 庄河市| 连江县| 鹤峰县| 通山县| 鄄城县| 南雄市| 电白县| 井冈山市| 永修县| 沅江市| 栖霞市| 安阳县| 儋州市| 贺州市| 浦县|