若是帶上事務,那麼用annotation方式的事務註解和bean配置,事務會失效,要將service bean配置到xml文件中才行
這個問題是因爲問答上有解決方案
引用
這個問題很經典了
在主容器中(applicationContext.xml),掃描註解 servicespring
1 <context:component-scan base-package="com"> 2 <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" /> 3 </context:component-scan>
而在springMVC配置文件中掃描 controllerexpress
1 <context:component-scan base-package="com"> 2 <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" /> 4 </context:component-scan>
由於spring的context是父子容器,因此會產生衝突,由ServletContextListener產生的是父容器,springMVC產生的是子容器,子容器Controller進行掃描裝配時裝配了@Service註解的實例,而該實例理應由父容器進行初始化以保證事務的加強處理,因此此時獲得的將是原樣的Service(沒有通過事務增強處理,故而沒有事務處理能力。
還有一種方式是將service層改用xml配置,其實這樣作也是變相的讓springmvc沒法掃描service,而只能依賴父窗口也就是ServletContextListener來進行初始化,這樣一樣被賦予了事務性。 mvc