一般來說,我們在整合spring和springmvc這兩個框架中,web.xml會這樣寫到:
平時我們在專案中注入關係是這樣的順序(結合圖來說):在service中注入dao(初始化自動注入,利用@autowired),接著在controller裡注入service(初始化自動注入,利用@autowired),
看圖,這就意味這作為springmvc的子容器是可以訪問父容器spring物件的。
那麼問大家乙個問題。要是反過來呢,你把controller注入到service中能行麼?
肯定是不行的啊!(如圖,這也說明了父容器是不能呼叫子容器物件的)
如果dao,serive,controller要是都在spring容器中,無疑上邊的問題是肯定的,因為都是在乙個bean裡,乙個容器中。
上面所配置的是乙個區域性掃瞄,而不是全域性掃瞄。接下來說原因:<?xml version="1.0" encoding="utf-8"?>
xmlns=""
xmlns:context=""
...../ 此處省略》
base-package="com.shop.service">
context:component-scan>
beans>
這裡就和上面講到的父子容器有關係,假設我們做了全域性掃瞄那麼**如下:
此時的spring容器中就會掃瞄到@controller,@service,@reposity,@component,此時的圖如下<?xml version="1.0" encoding="utf-8"?>
xmlns=""
xmlns:context=""
...../ 此處省略》
base-package="com.shop">
context:component-scan>
beans>
結合圖去看,相當於他們都會放到大的容器中,
而這時的springmvc容器中沒有物件,沒有物件就沒有controller,所以載入處理器,介面卡的時候就會找不到對映物件,對映關係,因此在頁面上就會出現404的錯誤。
2.如果不用spring容器,直接把所有層放入springmvc容器中可不可以?
當然可以,如果沒有spring容器,我們是可以把所有層放入springmvc的。單獨使用這個容器是完全可以的,而且是輕量級的。
3.那麼為什麼我們在專案中還要聯合用到spring容器和springmvc容器?
答案是:
spring的擴充套件性,如果要是專案需要加入struts等可以整合進來,便於擴充套件框架。如果要是為了快,為了方便開發,完全可以用springmvc框架。
4.元件分開掃瞄和直接全掃瞄的區別
分開掃瞄:
而在springmvc配置檔案中將service註解給去掉
因為spring的context是父子容器,所以會產生衝突,由servletcontextlistener產生的是父容器,springmvc產生的是子容器,子容器controller進行掃瞄裝配時裝配了@service註解的例項,而該例項理應由父容器進行初始化以保證事務的增強處理,所以此時得到的將是原樣的service(沒有經過事務加強處理,故而沒有事務處理能力。
還有一種方式是將service層改用xml配置,其實這樣做也是變相的讓springmvc無法掃瞄service,而只能依賴父視窗也就是servletcontextlistener來進行初始化,這樣同樣被賦予了事務性。
直接掃瞄:
直接掃瞄比較省事,但是事務回得不到處理,所以在具體的層面上還需要加入註解去宣告事務,比如在dao層和service層加入@transactional
spring父子容器
spring會生成父容器,一般用來載入dao和service,springmvc會生成子容器,一般用來載入controller,子容器可以看見父容器註冊的bean,父容器看不到子容器註冊的bean,配置預設子容器不查詢父容器註冊的bean,如果在父子容器中都註冊service,但是只有父容器註冊的s...
Spring 父子容器
必須要說的是,父子容器是通過設定形成的關係。或configurablebeanfactory介面,這兩個介面中分別有setparent及setparentbeanfactory方法,可以將指定容器設定為當前容器的父容器。contextattribute為key,將其儲存到servletcontext...
spring和springmvc父子容器問題
為什麼會出現這個問題呢,就是在整合配置web框架時,提高框架的效率減少冗餘,將絕大部分元件在spring中掃瞄,只有特定的元件放入springmvc中 例如service spring 和springmvc 的父子容器關係 spring和springmvc作為bean管理容器和mvc層的預設框架,已...