cuiyi's blog(崔毅 crazycy)

          記錄點滴 鑒往事之得失 以資于發展
          數據加載中……

          SpringMVC+MyBatis - 7 Spring自動掃描注解類的沖突問題

          Spring MVC項目中通常會有二個配置文件,sprng-servlet.xml和applicationContext.xml二個配置文件,通常會出現以下幾個配置

          1. <context:annotation-config />

          它的作用是隱式地向 Spring 容器注冊  
          - AutowiredAnnotationBeanPostProcessor、
          - CommonAnnotationBeanPostProcessor、
          - PersistenceAnnotationBeanPostProcessor、
          - RequiredAnnotationBeanPostProcessor 這4個BeanPostProcessor。

          其作用是如果你想在程序中使用注解,就必須先注冊該注解對應的類,如下圖所示:

          依賴的類注解
          CommonAnnotationBeanPostProcessor@Resource 、@PostConstruct、@PreDestroy
          PersistenceAnnotationBeanPostProcessor的Bean@PersistenceContext
          AutowiredAnnotationBeanPostProcessor Bean@Autowired
          RequiredAnnotationBeanPostProcessor@Required

            當然也可以自己進行注冊:

          <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor "/>  
          <bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor"/>


          2. <context:component-scan base-package="com.*" >

          <context:component-scan/> 配置項不但啟用了對類包進行掃描以實施注釋驅動 Bean 定義的功能,同時還啟用了注釋驅動自動注入的功能(即還隱式地在內部注冊了 AutowiredAnnotationBeanPostProcessor 和 CommonAnnotationBeanPostProcessor),因此當使用 <context:component-scan/> 后,就可以將 <context:annotation-config/> 移除了


          在這里有一個比較有意思的問題,就是掃描是否需要在二個配置文件都配置一遍,我做了這么幾種測試:

                      

            (1)只在applicationContext.xml中配置如下

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

            啟動正常,但是任何請求都不會被攔截,簡而言之就是@Controller失效

            (2)只在spring-servlet.xml中配置上述配置

            啟動正常,請求也正常,但是事物失效,也就是不能進行回滾

            (3)在applicationContext.xml和spring-servlet.xml中都配置上述信息

            啟動正常,請求正常,也是事物失效,不能進行回滾

            (4)在applicationContext.xml中配置如下

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

            在spring-servlet.xml中配置如下

              <context:component-scan base-package="com.sohu.login.web" />

            此時啟動正常,請求正常,事物也正常了。

            結論:在spring-servlet.xml中只需要掃描所有帶@Controller注解的類,在applicationContext中可以掃描所有其他帶有注解的類(也可以過濾掉帶@Controller注解的類)。


          3. <mvc:annotation-driven />

            它會自動注冊DefaultAnnotationHandlerMapping 與AnnotationMethodHandlerAdapter

          出處:http://www.cnblogs.com/fangqi/archive/2012/12/11/2812745.html

          posted on 2014-07-12 23:45 crazycy 閱讀(9280) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 龙泉市| 涞源县| 常宁市| 长沙县| 恭城| 荔波县| 湛江市| 兴和县| 麟游县| 航空| 资溪县| 大姚县| 江西省| 诸暨市| 拉孜县| 仁布县| 恭城| 安宁市| 蒲城县| 陆良县| 安化县| 大安市| 长乐市| 台中市| 时尚| 桃源县| 仁怀市| 光山县| 芜湖县| 甘泉县| 普陀区| 彭阳县| 青海省| 南宁市| 靖州| 晋江市| 石门县| 日土县| 额敏县| 太和县| 滨州市|