91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

如何解決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

咸阳市| 昭平县| 清新县| 筠连县| 洛扎县| 桐城市| 翼城县| 大竹县| 永修县| 嵩明县| 平阴县| 鹤庆县| 南木林县| 武山县| 赞皇县| 柘荣县| 平昌县| 承德市| 库伦旗| 潞城市| 图们市| 青州市| 海阳市| 朝阳县| 额济纳旗| 南宫市| 陵水| 绥江县| 禹城市| 大安市| 武汉市| 龙江县| 武义县| 正镶白旗| 东平县| 华阴市| 绩溪县| 志丹县| 沙坪坝区| 秦皇岛市| 陆川县|