springMvc和spring的父子容器

2021-09-27 06:06:06 字數 1470 閱讀 3177

何為父子容器?

spring正題框架的核心概念中, 容器是核心思想。用來管理bean 的整個生命週期,在乙個專案中,容器不僅僅只有乙個。容器之間也存在上下層關係,當乙個專案中引入spring和springmvc這兩個框架,其實就是2個容器,spring是父容器,springmvc是其子容器,

子容器可以訪問父容器物件,而父容器不可以訪問子容器物件。(對父子屬性不成立)

該如何理解子容器可以訪問父容器物件,而父容器不可以訪問子容器物件? 舉個栗子

web層的congtroller定義的類中,可以引用service層的物件(的介面,ic即物件),相反則不成立。

好了,接下來進入討論的關鍵:

當我們使用註解開發的時候,對於bean 的註冊,我們使用如下的配置:

spring參考手冊中講到,該配置的功能是掃瞄預設包下的所有的@component註解,並且自動註冊到容器(生成bean,簡化了xml檔案中配置的繁瑣工作)中,同時也掃瞄@controller,@service,@respository這三個註解註冊他們所對應的bean到對應的容器中,因為他們是繼承自@component。

以上的這個註解配置,使用於父類和子類容器。

當然,還有乙個springmvc相關的配置 

問題**?

在實際的開發中,由於有了強大的註解功能,很多基於xml的配置方式已經被替代,但是在實際專案中,同時配置spring和springmvc時會出現一些奇怪的異常,比如bean被多次載入,多次例項化,或者依賴注入時,bean不能被自動注入,但是明明你已經將該bean註冊了。

配置方式1:

配置方式2:

將和都配置在

為何?我用方式1.父容器進行掃瞄註冊所有的bean,自容器負責使用相關的註解,難道不可以嗎?檢視原始碼發現的確不可以。

方式2卻可以。原因是:

springmvc初始化時,會尋找所有當前容器中的所有@controller註解的bean,在方式1中,而當前容器springmvc容器中卻沒有註冊的bean。所有的@controller配置的bean都註冊在spring父容器中了。

what?難道就沒有方式1的解決方案了嗎?

答案是有的!在預設的情況下,自類容器不可以獲得父類容器的bean,當然我們可以在子類容器中配置使用父類的容器。

true

好了,前面的兩種方式不是最完美的。

下面介紹第三種比較好的方式:

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

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

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

何為父子容器?

SpringMVC學習筆記之與Spring的關係

需要進行 spring 整合 springmvc 嗎 還是否需要再加入 spring 的 ioc 容器嗎 是否需要再 web.xml 檔案中配置啟動 spring ioc 容器 contextloaderlistener 嗎 需要 通常情況下,類似於資料來源 事務 整合其它框架都是放在spring ...

1019 數字黑洞(sscanf和sprintf)

給定任乙個各位數字不完全相同的 4 位正整數,如果我們先把 4 個數字按非遞增排序,再按非遞減排序,然後用第 1 個數字減第 2 個數字,將得到乙個新的數字。一直重複這樣做,我們很快會停在有 數字黑洞 之稱的 6174,這個神奇的數字也叫 kaprekar 常數。例如,我們從6767開始,將得到 7...

通過HelloSpring了解Spring的IOC

在dao層建立乙個hello實體類。package dao public class hello public void setstr string str override public string tostring 然後要輸出就要建立物件,在spring中,有乙個ioc池,需要使用物件就在池裡...