1. 程式人生 > >Spring源碼解析(三):父子容器的概念

Spring源碼解析(三):父子容器的概念

意思 資源 圖片 方法 一起 listen 調用 rop getbean

  相信大家現在在使用spring項目開發時可能不只是單單使用spring一個框架進行開發, 可能會用到現在主流的ssm,spring和springmvc一起使用。

  而在一起使用的時候我就發現了一個問題,在web.xml配置spring容器初始化的時候存在一個問題。

 技術分享圖片

  一般我們在配置spring容器初始化時都會用最常見的兩種方式,用ContextLoaderListener初始化spring容器,用DispatcherServlet 初始化springmvc容器,但是我發現我就使用DispatcherServlet 初始化一個容器,只要同時將關於spring的配置文件都加載進來,項目也能正常的運行。

技術分享圖片

這個時候可能就引出了一個父子容器的概念。而典型的父子容器就是spring和springmvc同時使用的時候。分別ContextLoaderListener 創建的 容器是父容器,DispatcherServlet 創建的容器是子容器。

  而父容器和子容器的區別。比如父容器有a.b.c三個bean對象,子容器有d.e.f三個bean對象,子容器就可以通過getBean方法調用父容器的a.b.c bean對象,而父容器不能通過getBean拿到子容器的d.e.f三個bean對象。但是這裏有一個例外property-placeholder,容器中讀取的配置文件就是私有的,互相不能訪問。其中也要弄清楚的是父子容器並不是一種包含關系,而是平行關系,但是在子容器中有一個parent,指向父容器,也就是說子容器在通過getBean訪問父容器中的bean對象時是通過parent訪問。

  這種做法的實際意思就是在一個JVM,只有一個樹狀結構的容器樹。可以通過子容器訪問父容器資源。就比如在實際開發中使用ssm框架,spring可以管理service,mapper,springmvc管理controller,mybatis編寫mapper,controller就需要調用service,service調用mapper,因為springmvc容器是spring的子容器,可以通過父容器找到service和mapper,但是在service中卻是找不到controller的。保證一種資源的局部性。

Spring源碼解析(三):父子容器的概念