Spring3.x事務失效的緣由以及解決辦法

項目中若是使用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

相關文章
相關標籤/搜索