spring和springmvc父子容器問題

2021-07-25 21:14:12 字數 3165 閱讀 3414

為什麼會出現這個問題呢,就是在整合配置web框架時,提高框架的效率減少冗餘,將絕大部分元件在spring中掃瞄,只有特定的元件放入springmvc中 ,例如service

spring 和springmvc 的父子容器關係

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了,只要使用統一的如下配置即可。 1

根據spring提供的參考手冊,該配置的功能是掃瞄預設包下的所有的@component註解,並且自動註冊到容器中,同時也掃瞄@controller,@service,@respository這三個註解,他們是繼承自@component。

除了以上我們使用的掃瞄配置,在專案中我們經常見到的就是這個配置,其實有了以上的配置,這個是可以省略掉的。

handleradapter,是springmvc中用來處理具體請求對映到具體方法的,其自身也分很多種類;

好了,有了以上基礎知識的鋪墊,我們看下現在這樣的乙個使用場景中,spring與springmvc的容器衝突的原因在那裡!

配置方式b,如下:

要想檢視具體原因,翻看原始碼,從springmvc的dispatcherservlet開始看,在乙個請求進來之後,發生了什麼?漫長的檢視之後,找到原因,如下。

springmvc初始化時,會尋找所有當前容器中的所有@controller註解的bean,來確定其是否是乙個handler,而當前容器springmvc中註冊的bean中並沒有@controller註解的,注意,上面提及的配置方式a,所有的@controller配置的bean都註冊在spring這個父容器中了,看**。 1

2

3

4

5

6

7

8

9

10

11

12

13

14

protectedvoidinithandlermethods()

string beannames = (this.detecthandlermethodsinancestorcontexts ?

class) :

class));

for(string beanname : beannames)

}

handlermethodsinitialized(gethandlermethods());

}

在方法ishandler中會判斷當前bean的註解是否是controller,**如下: 1

2

3

protectedbooleanishandler(class<?> beantype)

在配置方式b中,springmvc容器中包括了所有的@controller註解的bean,所以自然就能找到了。

1

2

3

4

5

true

以上已經有了2種解決方案了,但在實際工程中,會包括很多配置,根據不同的業務模組來劃分,所以我們一般思路是各負其責,明確邊界,spring根容器負責所有其他非controller的bean的註冊,而springmvc只負責controller相關的bean的註冊。第三種方案如下:

spring容器配置,排除所有@controller的bean
1

2

3

springmvc容器配置,讓其只包括@controller的bean
1

2

3

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...

Thymeleaf模板與Spring MVC整合

thymeleaf 定義了 org.thymeleaf.spring4.view.thymeleafview 和 org.thymeleaf.spring4.view.thymeleafviewresolver 預設使用thymeleafview 作為 view thymeleaf 提供了乙個spr...