1. 程式人生 > >Spring和Spring MVC包分開掃描原因

Spring和Spring MVC包分開掃描原因

一、Spring和SpringMVC的父子容器關係

1.講問題之前要先明白一個關係

一般來說,我們在整合spring和SpringMVC這兩個框架中,web.xml會這樣寫到:

<!-- 載入spring容器 --><!-- 初始化載入application.xml的各種配置檔案 --><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring/application-*.xml</param-value>
</context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><!-- 配置springmvc前端控制器 --><servlet><servlet-name>taotao-manager</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet
</servlet-class><!-- contextConfigLocation不是必須的, 如果不配置contextConfigLocation, springmvc的配置檔案預設在:WEB-INF/servlet的name+"-servlet.xml" --><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring/springmvc.xml</param-value></init-param>
<load-on-startup>1</load-on-startup></servlet>

首先配置的是Spring容器的初始化載入的application檔案,然後是SpringMVC的前端控制器(DispatchServlet),當配置完DispatchServlet後會在Spring容器中建立一個新的容器。其實這是兩個容器,Spring作為父容器,SpringMVC作為子容器。
讓我們用圖來看一下這個父子關係的原理:
圖片描述

平時我們在專案中注入關係是這樣的順序(結合圖來說):在Service中注入Dao(初始化自動注入,利用@Autowired),接著在Controller裡注入Service(初始化自動注入,利用@Autowired),看圖,這就意味這作為SpringMVC的子容器是可以訪問父容器Spring物件的。

那麼問大家一個問題。要是反過來呢,你把Controller注入到Service中能行麼?
肯定是不行的啊!(如圖,這也說明了父容器是不能呼叫子容器物件的)

如果Dao,Serive,Controller要是都在Spring容器中,無疑上邊的問題是肯定的,因為都是在一個bean裡,一個容器中。

2.問題:為什麼不能在Spring中的Service層配置全域性掃描?

例如:一個專案中我總專案的名字叫com.shop,我們在配置applicationContext-service.xml中,包掃描程式碼如下:

<?xml version="1.0" encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context" 
    ...../ 此處省略><!-- 掃描包Service實現類 --><context:component-scanbase-package="com.shop.service"></context:component-scan></beans>

上面所配置的是一個區域性掃描,而不是全域性掃描。接下來說原因:
這裡就和上面講到的父子容器有關係,假設我們做了全域性掃描那麼程式碼如下:

<?xml version="1.0" encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context" 
    ...../ 此處省略><!-- 掃描包Service實現類 --><context:component-scanbase-package="com.shop"></context:component-scan></beans>

此時的Spring容器中就會掃描到@Controller,@Service,@Reposity,@Component,此時的圖如下:
圖片描述
結合圖去看,相當於他們都會放到大的容器中,而這時的SpringMVC容器中沒有物件,沒有物件就沒有Controller,所以載入處理器,介面卡的時候就會找不到對映物件,對映關係,因此在頁面上就會出現404的錯誤。

3.如果不用Spring容器,直接把所有層放入SpringMVC容器中可不可以?

當然可以,如果沒有Spring容器,我們是可以把所有層放入SpringMVC的。單獨使用這個容器是完全可以的,而且是輕量級的。就是直接把所有的層次關係都放到了SpringMVC中,並沒有用到Spring容器。

4.那麼為什麼我們在專案中還要聯合用到Spring容器和SpringMVC容器?

答案是:Spring的擴充套件性,如果要是專案需要加入Struts等可以整合進來,便於擴充套件框架。如果要是為了快,為了方便開發,完全可以用SpringMVC框架。

5.結論

如果在專案中我們在Service層做全域性包掃描,那麼springmvc不能提供服務,因為springmvc子容器中沒有controller物件。


相關推薦

SpringSpring MVC分開掃描原因

一、Spring和SpringMVC的父子容器關係 1.講問題之前要先明白一個關係 一般來說,我們在整合spring和SpringMVC這兩個框架中,web.xml會這樣寫到: <!-- 載入spring容器 --><!-- 初始化載入applica

為啥SpringSpring MVC掃描分開

ESS 原來 html htm ID vat 收藏 不支持 不能 背景: 最近在搭建新工程的時候發現有些Spring的配置不是很了解,比如Spring 配置裏面明明配置了component-scan,為啥Spring MVC配置文件還需要配置一下,這樣豈不是多此

為啥SpringSpring MVC掃描分開

掃描 3.0 htm isp location spring 自動 web contex 開始學習springmvc各種小白問題 根據例子配置了spring掃描包,但是一直提示404錯誤,經過大量搜索,發現,掃描包的配置應該寫在springmvc的配置文件中,而不是spri

SpringSpring MVC掃描

enc 是個 原因 官方 drive XML 映射 下層 filter 在Spring整體框架的核心概念中,容器是核心思想,就是用來管理Bean的整個生命周期的,而在一個項目中,容器不一定只有一個,Spring中可以包括多個容器,而且容器有上下層關系,目前最常見的一種場景就

【轉載】SpringSpring MVC掃描

轉自:http://www.cnblogs.com/junzi2099/p/8042476.html 在Spring整體框架的核心概念中,容器是核心思想,就是用來管理Bean的整個生命週期的,而在一個專案中,容器不一定只有一個,Spring中可以包括多個容器,而且容器有上下層關係,目前最常見的一

SpringSpringMVC的掃描問題

問題的出現 當使用Spring和SpringMVC時都需要在相應的配置檔案中作相應的包掃描配置,同樣的配置難道不會衝突?當然會。 基本概念 Spring是父容器,SpringMVC是其子容器,子容器SpringMVC可以看見父容器Spring中註冊的b

關於Spring Spring MVC的43面試題及答案

1.為什麼使用Spring ? 1). 方便解耦,簡化開發 通過Spring提供的IoC容器,可以將物件之間的依賴關係交由Spring進行控制,避免硬編碼所造成的過度程式耦合。 2). AOP程式設計的支援 通過Spring提供的AOP功能,方便進行面向切面的程式設計,如效能監測、事

springspring-mvc容器

Spring和SpringMVC作為Bean管理容器和MVC層的預設框架,已被眾多WEB應用採用,而實際使用時,由於有了強大的註解功能,很多基於XML的配置方式已經被替代,但是在實際專案中,同時配置Spring和SpringMVC時會出現一些奇怪的異常,比如B

springspring MVC整合

spring和springMVC之間的整合,springMVC中的jar包包含spring中的jar包,所以無需再另外匯入jar包,只需匯入springMVC的jar包即可。 如圖一所示: 這個時候,再新建兩個原始檔夾,一個為config專門放配置檔案,另外一個為test

關於springspringmvc的xml自動掃描配置問題

今天在嘗試搭建一下SSM框架的時候,在webapp目錄下有一個MyJsp.jsp。部署到伺服器後,能夠正常訪問,然後我去寫了一個頁面,通過controller進行訪問,但是死活不出來,而且提示一個404頁面。 我看了下控制檯DEBUG的輸出:No mapping foun

spring spring cloud 組成

conf 發布 soa 很多 arc 解決方案 引入 生成 auth spring 頂級項目:Spring IO platform:用於系統部署,是可集成的,構建現代化應用的版本平臺,具體來說當你使用maven dependency引入spring jar包時它就在工作了。

初步認識SpringSpring外掛的安裝

01 Spring 的發展史   1、Spring 1.x時代 在Spring1.x時代,都是通過xml檔案配置bean,隨著專案的不斷擴大,需要將xml配置分放到不同的配置檔案中,需要頻繁的在java類和xml配置檔案中切換。 2、Spring2.x時代 隨著JDK

SpringSpring Boot2.0原始碼閱讀環境搭建結構

一:Spring 第一步:安裝git和gradle,以及Java8,並配置環境變數。   第二步:開啟gitbash,cd到你要放置spring原始碼工程的目錄,輸入:git clone https://github.com/spring-projects/sprin

SpringSpring Boot的屬性

不同的 set dom 如果 配置 方案 extc 時間 註冊 1.概述 本教程將展示如何在Spring中設置和使用Properties - 通過Java配置和@PropertySource或通過XML和<property-placeholder>,以及屬性如

SpringMVCSpring的配置檔案掃描詳解

其實Spring和SpringMVC是有父子容器關係的,而且正是因為這個才往往會出現包掃描的問題,我們在此來分析和理解Spring和SpringMVC的父子容器關係並且給出Spring和SpringMVC配置檔案中包掃描的官方推薦方式。   在Spring整體框架的核

springmvc與Spring配置檔案中掃描元件分開掃描直接全掃描的區別

在主容器中(applicationContext.xml),將Controller的註解排除掉 <context:component-scan base-package="com">   <context:exclude-filter type="annotation" expression

spring boot只會掃描啟動類當前以下的

 如果將 spring boot 放在 包  com.test.controller 裡面的話 ,它會掃描 com.test.controller 和 com.test.controller.* 裡面的所有的,可以新增@ComponentScan(basePackages =

Struts2Spring MVC 區別 今天面試被問到了

上下 知識庫 quest 程序 body del esp 創建 let 雖然說沒有系統的學習過Spring MVC框架, 但是工作這麽長時間, 基本上在WEB層使用的都是Spring MVC, 自己覺得Struts2也是一個不錯的WEB層框架, 這兩種框架至今自己還未有比較

Strut2 Spring MVC 文件上傳對比

string num control 需要 nsf ping types quest nal 在Java領域中,有兩個常用的文件上傳項目:一個是Apache組織Jakarta的Common-FileUpload組件 (http://commons.apache.org/pr

MavenSpring mvc下的頁面的跳轉與取值

servle 提交 輸入 接收 -m title style ofo pri (此處tomcat的端口設置為80) 例如:在testForm.jsp裏提交表單,在ok.jsp裏取值 testForm.jsp頁面代碼如下: <%@ page contentType="