關于SpringBoot動態代理配置說明
由于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()
方法初始化即可,此時對象已被動態代理
實現方法其實很簡單,只是給了個思路。如果有更好的解決方法可以后續評論