1、前言 web
發散問題系列,是圍繞平常工做,發散思考,提取問題,並尋求答案的一個系列。總的來講,就是將遇到的問題發散來提出更多的問題,並經過解決發散問題,從而對問題有更深刻的瞭解,對知識有更深入的記憶,幫助自身的提升。歡迎你們將問題繼續發散,或者將已有問題更深刻的闡述,以達到共同進步的目的。 spring
2、背景描述 shell
有這樣一個幾個相關的工程: 框架
Shell層打包成war包後,會將其餘幾個項目的jar包引用到WEB_INF\lib目錄下 spa
這些工程的結構大體是這樣子的: 3d
3、問題提出 code
若是在shell項目的web.xml中,有設置以下: xml
<context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:/META-INF/spring/*.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
那麼,對象
1)Spring的容器是什麼,用來幹什麼? blog
答:Spring 容器是 Spring 框架的核心。容器將建立對象,把它們鏈接在一塊兒,配置它們,並管理他們的整個生命週期從建立到銷燬。Spring 容器使用依賴注入(DI)來管理組成一個應用程序的組件。這些對象被稱爲 Spring Beans。經過閱讀配置元數據提供的指令,容器知道對哪些對象進行實例化,配置和組裝。配置元數據能夠經過 XML,Java 註釋或 Java 代碼來表示。
2)應用會加載哪些xml配置文件到spring中(本項目的xml、仍是包括其餘項目的xml,還會包括jar包的xml嗎?)
答:這裏要留意到"classpath*"這個符號,web.xml中classpath與classpath*有如下區別:
classpath:只會到你的class路徑中查找找文件;
classpath*:不只包含class路徑,還包括jar文件中(class路徑)進行查找
因此,這樣子配置的話,會搜索本項目xml、其餘項目xml以及jar包中的xml。只要是位於/META-INF/spring/目錄下的xml,都會做爲Spring容器的配置文件加載到一塊兒。
3)web.xml中指示讀了一堆xml,那這些配置是做爲同一個容器,仍是分開多個容器?
答:做爲同一個容器來讀取,也就是說,全部提到的xml裏面的bean都會裝載到一個容器上來。
4)這些xml的加載順序是怎麼樣的?
答:經試驗,順序不肯定,因此建議定義的每一個xml有本身的工做範圍,xml與xml之間不要有太多的關係,例如xml之間的bean互相引用,這樣子可能會形成加載時的問題。