中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何解決SpringBoot內部調用事務不起作用的問題

發布時間:2021-07-28 14:21:43 來源:億速云 閱讀:169 作者:小新 欄目:編程語言

這篇文章給大家分享的是有關如何解決SpringBoot內部調用事務不起作用的問題的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

場景

我在這里模擬一個場景,大概的調用方式就如下面的代碼這樣。

  @Override
  @Transactional(rollbackFor = RuntimeException.class)
  public void insertUser(User user) {
    userMapper.insertUser(user);
    throw new RuntimeException("");
  }
  
  /**
   * 內部調用新增方法
   *
   * @param user
   */
  @Override
  public void invokeInsertUser(User user) {
    this.insertUser(user);
  }

原因

AOP使用的是動態代理的機制,它會給類生成一個代理類,事務的相關操作都在代理類上完成。內部方式使用this調用方式時,使用的是實例調用,并沒有通過代理類調用方法,所以會導致事務失效。

解決辦法

方法一 引入自身bean

在類內部通過@Autowired將本身bean引入,然后通過調用自身bean,從而實現使用AOP代理操作。

注入自身bean

  @Autowired
  @Lazy
  private UserService service;

修改invokeInsertUser方法

  /**
   * 解決方法一 在bean中將自己注入進來
   * @param user
   */
  @Override
  public void invokeInsertUser(User user) {
    this.service.insertUser(user);
  }

方法二 通過ApplicationContext引入bean

通過ApplicationContext獲取bean,通過bean調用內部方法,就使用了bean的代理類。

注入ApplicationContext

  @Autowired
  ApplicationContext applicationContext;

修改invokeInsertUser方法

  /**
   * 解決方法二 通過applicationContext獲取到bean
   * @param user
   */
  @Override
  public void invokeInsertUser(User user) {
    ((UserService)applicationContext.getBean("userService")).invokeInsertUser(user);
  }

方法三 通過AopContext獲取當前類的代理類

通過AopContext獲取當前類的代理類,直接通過代理類調用方法

在引導類上添加@EnableAspectJAutoProxy(exposeProxy=true)注解

修改invokeInsertUser方法

  /**
   * 解決方法三 通過applicationContext獲取到bean
   *
   * @param user
   */
  @Override
  public void invokeInsertUser(User user) {
    ((UserService) AopContext.currentProxy()).invokeInsertUser(user);
  }

感謝各位的閱讀!關于“如何解決SpringBoot內部調用事務不起作用的問題”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

察哈| 顺义区| 武山县| 普安县| 越西县| 湛江市| 冷水江市| 南丹县| 丽水市| 伊金霍洛旗| 繁昌县| 土默特左旗| 河北省| 淮滨县| 伊宁市| 图们市| 城固县| 外汇| 东港市| 绿春县| 普洱| 前郭尔| 高邑县| 枣强县| 方山县| 靖州| 永寿县| 尖扎县| 合江县| 汶川县| 柳州市| 双城市| 新闻| 东安县| 和龙市| 安西县| 衡阳市| 新疆| 涞源县| 安阳县| 当雄县|