項目中若是使用spring來管理事務,可能會出現事務失效的狀況,我認爲主要的緣由是cglib沒法獲取到代代理的實例。。 spring
若是帶上事務,那麼用annotation方式的事務註解和bean配置,事務會失效,要將service的bean配置到xml文件中才行,這樣springmvc就不會掃描到@Service的類了 express
這個問題有另外一種解決辦法:
首先在主容器中(applicationContext.xml),將Controller的註解排除掉
<context:component-scan base-package="com">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>
而後在springMVC配置文件中將Service註解給去掉
<context:component-scan base-package="com">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" />
</context:component-scan>
由於spring的context是父子容器,因此會產生衝突,由ServletContextListener產生的是父容器,springMVC產生的是子容器,子容器Controller進行掃描裝配時裝配了@Service註解的實例,而該實例理應由父容器進行初始化以保證事務的加強處理,因此此時獲得的將是原樣的Service(沒有通過事務增強處理,故而沒有事務處理能力。
還有一種方式是將service層改用xml配置,其實這樣作也是變相的讓springmvc沒法掃描service,而只能依賴父窗口也就是ServletContextListener來進行初始化,這樣一樣被賦予了事務性。 mvc