Spring-boot +Shiro 致使事務無效

今天在開發過程當中,遇到一個狀況,就是事務事務,同項目的別的service都在事務中,能夠就是有一個事務失效.spring

排除了各類狀況數據庫

1.檢查數據庫的引擎是不是innoDB緩存

2.方法是否爲publicapp

3.這裏引用的是spring-tx.xml配置的事務管理代理

除去以上的狀況,發現仍是不行,就徹底有點摸不着頭腦了.xml

通過一番調查後,發現是和Shiro結合致使的問題.對象

 

查了下解釋:接口

因爲ShiroFilterFactoryBean實現了FactoryBean接口,因此它會提早被初始化。又由於SecurityManager,SecurityManager依賴於Realm實現類、Realm實現類又依賴於UserService,因此引起全部相關的bean提早初始化。事務

ShiroFilterFactoryBean -> SecurityManager -> Realm實現類 -> UserService開發

可是此時還只是ApplicationContext中registerBeanPostProcessors註冊BeanPostProcessor處理器的階段,此時AnnotationAwareAspectJAutoProxyCreator尚未註冊到BeanFactory中,UserService沒法享受到事務處理!

我的理解大概就是,由於在Realm 中使用了該service,至關於實例化了一次,因爲是單例模式,後面都是沿用這個引用.因爲初始化的對象都尚未可以被事務管理,因此致使此問題.

解決辦法:

在Realm實現中使用Mapper,而不是直接使用Service對象。缺點:直接和數據庫交互,而且也沒有Service中的邏輯交互以及緩存在Realm中Service聲明上加入@Lazy註解,延遲Realm實現中Service對象的初始化時間,這樣就能夠保證Service實際初始化的時候會被BeanPostProcessor攔截,建立具備事務功能的代理對象

相關文章
相關標籤/搜索