Spring和springmvc父子容器注解掃描問題詳解


 

一、Spring容器和springmvc容器的關系如下圖所示:

Springspringmvc和作為兩個獨立的容器,會把掃描到的注解對象分別放到兩個不同的容器中,

Springmvc容器是spring容器的一部分,他們訪問對象的范圍如下所示:

①:springmvc子容器可以訪問spring父容器中的對象

②:spring父容器不能訪問springmvc子容器中的對象

 

***在實際應用中的實例***

一般情況下,一個spring / springmvc / mybatis 組合的框架中,會存在以下幾個配置文件:

 

  1. applicationContext-service.xml 文件

        <!-- 配置service層的組件掃描器 -->

        <context:component-scan base-package="com.prozhu.service"></context:component-scan>

    說明:在這個里面存在着一個spring的注解掃描器。用來掃描@Service的注解

     

  2. Springmvc.xml 文件

    <!-- 配置Controller掃描器 -->

    <context:component-scan base-package="com.prozhu.controller" />

    說明:這個里面存在着springmvc的注解掃描器,專門用來掃描@Controller的注解

     

    然后呢?有點同學可能會想,我能不能合並成一個注解掃描器,來完成對象注入的問題?將配置文件中的注解掃描器更改為如下配置:

     

    applicationContext-service.xml文件中進行全局掃描的配置:

    而在springmvc中不配置注解掃描器

    <!-- 配置spring的注解掃描器 -->

    <context:component-scan base-package="com.prozhu" />

     

    說明:用這個掃描器分別掃描service層和controller層的注解:@Service /@Controller / @Autowired

    當一旦采用這種方式之后,spring會將掃描的對象都會存放到spring的容器,而不會放到springmvc子容器中,當訪問項目的時候,

    springmvc找不到處理器映射器,和其對應的Controller,進而報404錯誤!

     

  3. 不用spring 容器,只用springmvc 容器行不行呢?

    答案:是可以的,在這個里面可以同時掃描Controller層、service層、dao層的注解。

     

  4. 在springmvc spring 都有注解掃描的前提下,能不能將事務配置在Controller 層?

    答案:是不能的,因為事務管理器是配置在spring容器中的,如果將事務配置在Controller層的話,spring容器就訪問不了springmvc子容器,

    進而無法訪問到事務對象。進而導致事務失效。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM