spring和springmvc作為bean管理容器和mvc層的預設框架,已被眾多web應用採用,而實際使用時,由於有了強大的註解功能,很多基於xml的配置方式已經被替代,但是在實際專案中,同時配置spring和springmvc時會出現一些奇怪的異常,比如bean被多次載入,多次例項化,或者依賴注入時,bean不能被自動注入,但是明明你已經將該bean註冊了的。找原因還是要看問題的根源,我們從容器說起。
在spring整體框架的核心概念中,容器是核心思想,就是用來管理bean的整個生命週期的,而在乙個專案中,容器不一定只有乙個,spring中可以包括多個容器,而且容器有上下層關係,目前最常見的一種場景就是在乙個專案中引入spring和springmvc這兩個框架,其實就是2個容器,spring是根容器,springmvc是其子容器,並且在spring根容器中對於springmvc容器中的bean是不可見的,而在springmvc容器中對於spring根容器中的bean是可見的,也就是子容器可以看見父容器中的註冊的bean,反之就不行。理解這點很重要,因為這是乙個規則,是spring自己設定的,但是往下看,我們會發現有些地方它並不預設使用這個規則。
當我們使用註解時,對於bean註冊這個功能的實現就不需要在給每個bean配置xml了,只要使用統一的如下配置即可。
根據spring提供的參考手冊,該配置的功能是掃瞄預設包下的所有的@component註解,並且自動註冊到容器中,同時也掃瞄@controller,@service,@respository這三個註解,他們是繼承自@component。
除了以上我們使用的掃瞄配置,在專案中我們經常見到的就是這個配置,其實有了以上的配置,這個是可以省略掉的。
handleradapter,是springmvc中用來處理具體請求對映到具體方法的,其自身也分很多種類;
好了,有了以上基礎知識的鋪墊,我們看下現在這樣的乙個使用場景中,spring與springmvc的容器衝突的原因在那裡!
配置方式b,如下:
要想檢視具體原因,翻看原始碼,從springmvc的dispatcherservlet開始看,在乙個請求進來之後,發生了什麼?漫長的檢視之後,找到原因,如下。
springmvc初始化時,會尋找所有當前容器中的所有@controller註解的bean,來確定其是否是乙個handler,而當前容器springmvc中註冊的bean中並沒有@controller註解的,注意,上面提及的配置方式a,所有的@controller配置的bean都註冊在spring這個父容器中了,看**。
protected void inithandlermethods()
string beannames = (this.detecthandlermethodsinancestorcontexts ?
for (string beanname : beannames)
}handlermethodsinitialized(gethandlermethods());
}
在方法ishandler中會判斷當前bean的註解是否是controller,**如下:
protected boolean ishandler(class<?> beantype)
在配置方式b中,springmvc容器中包括了所有的@controller註解的bean,所以自然就能找到了。
以上已經有了2種解決方案了,但在實際工程中,會包括很多配置,根據不同的業務模組來劃分,所以我們一般思路是各負其責,明確邊界,spring根容器負責所有其他非controller的bean的註冊,而springmvc只負責controller相關的bean的註冊。第三種方案如下:
spring容器配置,排除所有@controller的bean
springmvc容器配置,讓其只包括@controller的bean
個人比較推薦第三種方案。引申一下,專案中使用事務的配置方案,也會在這種場景下失效,歸根結底也是由於2個容器的可見性問題導致,可以結合具體問題按照上面的思路進行查詢原因!(——全文完——)
Thymeleaf模板與Spring MVC整合
thymeleaf 定義了 org.thymeleaf.spring4.view.thymeleafview 和 org.thymeleaf.spring4.view.thymeleafviewresolver 預設使用thymeleafview 作為 view thymeleaf 提供了乙個spr...
SpringBoot擴充套件SpringMVC
編寫乙個配置類,型別是webmvcconfigureradapter 繼承 使用webmvcconfigureradapter可以擴充套件,不能標註 enablewebmvc 既保留了配置,也能拓展我們自己的應用 configuration public class mymvcconfig exte...
springMVC學習(一)springMVC簡介
springmvc介紹 spring web mvc和struts2都屬於表現層的框架,它是spring框架的一部分,我們可以從spring的整體結構中看得出來 spring的整體結構圖 mvc是一種設計模式,mvc在b s系統下的應用 理解 1 使用者發起request請求至控制器 control...