dubbo 服務的啟動加載過程,請先看 : http://www.cnblogs.com/ghj1976/p/5316126.html
以 dubbo-demo-provider-2.5.4-SNAPSHOT 為例, 把這個文件當zip文件解壓縮后,
我們在其中可以找到 spring 的 配置文件: dubbo-demo-provider.xml
內容如下:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<bean id="demoService" class="com.alibaba.dubbo.demo.provider.DemoServiceImpl" />
<dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" />
</beans>
Spring其實就是一個大型的工廠,而Spring容器中的Bean就是該工廠的產品.對於Spring容器能夠生產那些產品,則取決於配置文件中配置。
對於我們而言,我們使用Spring框架所做的就是兩件事:開發Bean、配置Bean。對於Spring礦建來說,它要做的就是根據配置文件來創建Bean實例,並調用Bean實例的方法完成“依賴注入”。
<beans…/>元素是Spring配置文件的根元素,<bean…/>元素師<beans../>元素的子元素,<beans…/>元素可以包含多個<bean…/>子元素,每個<bean…/>元素可以定義一個Bean實例,每一個Bean對應Spring容器里的一個Java實例定義Bean時通常需要指定兩個屬性。
- Id:確定該Bean的唯一標識符,容器對Bean管理、訪問、以及該Bean的依賴關系,都通過該屬性完成。Bean的id屬性在Spring容器中是唯一的。
- Class:指定該Bean的具體實現類。注意這里不能使接口。通常情況下,Spring會直接使用new關鍵字創建該Bean的實例,因此,這里必須提供Bean實現類的類名。
Spring容器集中管理Bean的實例化,Bean實例可以通過BeanFactory的getBean(Stringbeanid)方法得到。BeanFactory是一個工廠,程序只需要獲取BeanFactory引用,即可獲得Spring容器管理全部實例的引用。程序不需要與具體實例的實現過程耦合。大部分Java EE應用里,應用在啟動時,會自動創建Spring容器,組件之間直接以依賴注入的方式耦合,甚至無須主動訪問Spring容器本身。
當我們在配置文件中通過<bean id=”xxxx” class=”xx.XxClass”/>方法配置一個Bean時,這樣就需要該Bean實現類中必須有一個無參構造器。故Spring底層相當於調用了如下代碼:
Xxx = new xx.XxClass()
參考: http://blog.csdn.net/chenssy/article/details/8222744
Spring 有一種配置文件加載設置:ClassPathXmlApplicationContext
ClassPathXmlApplicationContext:該容器從 XML 文件中加載已被定義的 bean。在這里,你不需要提供 XML 文件的完整路徑,只需正確配置 CLASSPATH 環境變量即可,因為,容器會從 CLASSPATH 中搜索 bean 配置文件。
有關ClassPathXmlApplicationContext 的信息請參考:
http://www.blogjava.net/xcp/archive/2011/06/22/352821.html
http://www.blogjava.net/wangkai40/archive/2009/08/28/292927.html
http://heisetoufa.iteye.com/blog/1671306
這里用的 classpath*:META-INF/spring/*.xml 中信息介紹如下:
classpath*: 可以加載多個配置文件,如果有多個配置文件,就用這個。
classpath*:的使用是為了多個component(最終發布成不同的jar包)並行開發,各自的bean定義文件按照一定的規則:package+filename,而使用這些component的調用者可以把這些文件都加載進來.
classpath*:的加載使用了classloader的 getResources()
方法,如果是在不同的J2EE服務器上運行,由於應用服務器提供自己的classloader實現,它們在處理jar文件時的行為也許會有所不同。 要測試classpath*:
是否有效,可以用classloader從classpath中的jar文件里加載文件來進行測。
參考: http://blog.csdn.net/kkdelta/article/details/5507799
完整的啟動加載過程如下圖:
參考資料: