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

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

  相信大家現在在使用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的。保證一種資源的區域性性。