SpringBoot解決Shiro導致依賴注入的bean事務失效問題

關于SpringBoot動態代理配置說明

代碼示例地址:https://github.com/JoeyBling/bootplus

由于shiroFilter在Spring自動裝配bean之前實例化
在繼承了AuthorizingRealm的類里使用依賴注入的bean及相關聯的Bean會被初始化完成且沒有被代理(包括BeanPostProcessor也會無效)導致事務失效等......

此種情形只在SpringBoot出現,SpringMVC方式不會

此時的service在bean中注入,但是調試發現并沒有被進行代理,所以導致Spring-AOP切面事務失效

所以采取的方式是不在bean初始化時注入Bean,而在程序運行后動態從SpringContext上下文中獲取

/**
 * 前置處理非空對象
 * shiroFilter在Spring自動裝配bean之前實例化
 * 相關聯的Bean都被初始化完成且沒有被代理(包括BeanPostProcessor也會無效)導致事務失效等......
 * 使用動態獲取代理對象即可解決
 */
protected void preHandleNull() {
    if (null == sysMenuService) {
        sysMenuService = SpringContextUtils.getBean(SysMenuService.class);
    }
    if (null == sysUserService) {
        sysUserService = SpringContextUtils.getBean(SysUserService.class);
    }
    if (null == constant) {
        constant = SpringContextUtils.getBean(Constant.class);
    }
}

在認證和授權方法調用前調用preHandleNull()方法初始化即可,此時對象已被動態代理

實現方法其實很簡單,只是給了個思路。如果有更好的解決方法可以后續評論

Tips:其他文章

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。