這篇文章給大家分享的是有關(guān)如何解決SpringBoot內(nèi)部調(diào)用事務(wù)不起作用的問(wèn)題的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。
10年積累的網(wǎng)站制作、成都網(wǎng)站建設(shè)經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶(hù)對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶(hù)得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有華安免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
場(chǎng)景
我在這里模擬一個(gè)場(chǎng)景,大概的調(diào)用方式就如下面的代碼這樣。
@Override @Transactional(rollbackFor = RuntimeException.class) public void insertUser(User user) { userMapper.insertUser(user); throw new RuntimeException(""); } /** * 內(nèi)部調(diào)用新增方法 * * @param user */ @Override public void invokeInsertUser(User user) { this.insertUser(user); }
原因
AOP使用的是動(dòng)態(tài)代理的機(jī)制,它會(huì)給類(lèi)生成一個(gè)代理類(lèi),事務(wù)的相關(guān)操作都在代理類(lèi)上完成。內(nèi)部方式使用this調(diào)用方式時(shí),使用的是實(shí)例調(diào)用,并沒(méi)有通過(guò)代理類(lèi)調(diào)用方法,所以會(huì)導(dǎo)致事務(wù)失效。
解決辦法
方法一 引入自身bean
在類(lèi)內(nèi)部通過(guò)@Autowired
將本身bean
引入,然后通過(guò)調(diào)用自身bean
,從而實(shí)現(xiàn)使用AOP
代理操作。
注入自身bean
@Autowired @Lazy private UserService service;
修改invokeInsertUser
方法
/** * 解決方法一 在bean中將自己注入進(jìn)來(lái) * @param user */ @Override public void invokeInsertUser(User user) { this.service.insertUser(user); }
方法二 通過(guò)ApplicationContext引入bean
通過(guò)ApplicationContext
獲取bean,通過(guò)bean調(diào)用內(nèi)部方法,就使用了bean的代理類(lèi)。
注入ApplicationContext
@Autowired ApplicationContext applicationContext;
修改invokeInsertUser
方法
/** * 解決方法二 通過(guò)applicationContext獲取到bean * @param user */ @Override public void invokeInsertUser(User user) { ((UserService)applicationContext.getBean("userService")).invokeInsertUser(user); }
方法三 通過(guò)AopContext獲取當(dāng)前類(lèi)的代理類(lèi)
通過(guò)AopContext
獲取當(dāng)前類(lèi)的代理類(lèi),直接通過(guò)代理類(lèi)調(diào)用方法
在引導(dǎo)類(lèi)上添加@EnableAspectJAutoProxy(exposeProxy=true)
注解
修改invokeInsertUser
方法
/** * 解決方法三 通過(guò)applicationContext獲取到bean * * @param user */ @Override public void invokeInsertUser(User user) { ((UserService) AopContext.currentProxy()).invokeInsertUser(user); }
感謝各位的閱讀!關(guān)于“如何解決SpringBoot內(nèi)部調(diào)用事務(wù)不起作用的問(wèn)題”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!