原文詳見
在spring整體框架的核心概念中,容器是核心思想,就是用來管理bean的整個生命週期的,而在乙個專案中,容器不一定只有乙個,spring中可以包括多個容器,而且容器有上下層關係,目前最常見的一種場景就是在乙個專案中引入spring和springmvc這兩個框架,那麼它其實就是兩個容器,spring是父容器,springmvc是其子容器,並且在spring父容器中註冊的bean對於springmvc容器中是可見的,而在springmvc容器中註冊的bean對於spring父容器中是不可見的,也就是子容器可以看見父容器中的註冊的bean,反之就不行。
我們可以使用統一的如下註解配置來對bean進行批量註冊,而不需要再給每個bean單獨使用xml的方式進行配置。
從spring提供的參考手冊中我們得知該配置的功能是掃瞄配置的base-package包下的所有使用了@component註解的類,並且將它們自動註冊到容器中,同時也掃瞄@controller,@service,@respository這三個註解,因為他們是繼承自@component。
在專案中我們經常見到還有如下這個配置,其實有了上面的配置,這個是可以省略掉的,因為上面的配置會預設開啟以下配置。以下配置會預設宣告了@required、@autowired、 @postconstruct、@persistencecontext、@resource、@predestroy等註解。
而上面這句配置spring3.1之前的版本和以下配置方式等價
spring3.1之後的版本和以下配置方式等價
下面讓我們來詳細扒一扒spring與springmvc的容器衝突的原因到底在那裡?
3.啟動專案我們發現springmvc無法進行跳轉,將log的日誌列印級別設定為debug進行除錯,發現springmvc容器中的請求好像沒有對映到具體controller中。
下面我們來檢視具體原因,翻看原始碼,從springmvc的dispatcherservlet開始往下找,我們發現springmvc初始化時,會尋找springmvc容器中的所有使用了@controller註解的bean,來確定其是否是乙個handler。1,2兩步的配置使得當前springmvc容器中並沒有註冊帶有@controller註解的bean,而是把所有帶有@controller註解的bean都註冊在spring這個父容器中了,所以springmvc找不到處理器,不能進行跳轉。核心原始碼如下:
protected void inithandlermethods()在方法ishandler中會判斷當前bean的註解是否是controller,原始碼如下:string beannames = (this.detecthandlermethodsinancestorcontexts ?
for (string beanname : beannames)
} handlermethodsinitialized(gethandlermethods());
}
protected boolean ishandler(class<?> beantype)
而在第4步配置中,springmvc容器中也註冊了所有帶有@controller註解的bean,故springmvc能找到處理器進行處理,從而正常跳轉。
我們找到了出現不能正確跳轉的原因,那麼它的解決辦法是什麼呢?
但在實際工程中會包括很多配置,我們按照官方推薦根據不同的業務模組來劃分不同容器中註冊不同型別的bean:spring父容器負責所有其他非@controller註解的bean的註冊,而springmvc只負責@controller註解的bean的註冊,使得他們各負其責、明確邊界。配置方式如下
關於use-default-filters="false"的作用,請參見另一篇部落格:context:component-scan標籤的use-default-filters屬性的作用以及原理分析 spring管理的類如何呼叫非spring管理的類
spring管理的類如何呼叫非spring管理的類.就是使用乙個spring提供的感知概念,在容器啟動的時候,注入上下文即可.下面是乙個工具類.1 import org.springframework.beans.bean ception 2import 3import 4import org.sp...
Spring基礎框架三 深入理解SpringMVC
spring mvc屬於springframework的後續產品,spring mvc框架提供了構建web應用程式的全功能mvc模組,是一種輕量級web框架。使用了mvc架構模式的思想,通過把model,view,controller分離,將web層進行職責解耦,把複雜的web應用分成邏輯清晰的幾部...
Spring 的使用與配置
其實後三個本質上都是 component。不過 repository 有一些多的功能,比如能把資料庫的 exception 轉到更高層。repository 可以通過 repository name 來標識乙個 bean,十分好用。spring 在 autowired時要裝配 inte ce 也不是...