這裡用eclipse來舉例,Spring容器是什麼?
Spring容器是Spring的核心,一切Spring bean都儲存在Spring容器內,並由其通過IoC技術管理。Spring容器也就是一個bean工廠(BeanFactory)。應用中bean的例項化,獲取,銷燬等都是由這個bean工廠管理的。
Spring容器究竟是什麼。
org.springframework.context.ApplicationContext介面用於完成容器的配置,初始化,管理bean。一個Spring容器就是某個實現了ApplicationContext介面的類的例項。也就是說,從程式碼層面,Spring容器其實就是一個ApplicationContext。
在普通的JAVA工程中,我們可以通過程式碼顯式new一個ClassPathXmlApplicationContext或者FileSystemXmlApplicationContext來初始化一個Spring容器。
在Web工程中,我們一般是通過配置web.xml的方式來初始化Spring容器。
Spring配置檔案
Spring配置檔案以XML格式呈現,如下:
在eclipse中,我們可以使用SpringSource Tool Suite工具來協助我們編寫Spring的配置檔案。
工程中允許有多個Spring配置檔案,我們可以按照自己的需求定義檔案的分類,例如可以從處理邏輯層級來區分:services.xml,daos.xml等。
另外,一個配置檔案可以引入多個其他的配置檔案,寫法如下:
通過ClassPathApplicationContext初始化Spring容器
new ClassPathXmlApplicationContext(new String[] {“services.xml”, “daos.xml”});
ApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"services.xml", "daos.xml"});
我們寫這一句簡單的程式碼,其實Spring在裡面做了很多功夫。
首先Spring會從classpath路徑下找到services.xml和daos.xml檔案,
然後將檔案內的配置資訊讀取出來,
然後做了N多內部的初始化工作(關於容器初始化的詳細細節,後面我會補充一篇文章從原始碼角度詳細說明)。
我們還可以用FileSystemApplicationContext來初始化Spring容器,
ApplicationContext context = new FileSystemXmlApplicationContext(“D:/Test/services.xml”);ApplicationContext context = new FileSystemXmlApplicationContext("D:/Test/services.xml");
這兩種方式效果是一樣的,只是通過不同的方式讀取配置檔案。
容器初始完後,我們就可以用這個容器來獲取我們之前配置了個bean,簡單示例如下:
// create and configure beansApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"services.xml", "daos.xml"});// retrieve configured instancePetStoreServiceImpl service = context.getBean("petStore", PetStoreServiceImpl.class);// use configured instanceList userList = service.getUsernameList();
Web工程的Spring配置
假設我們的web工程my-app的基礎目錄結構如下:
my-app
–src
—-resources
——services.xml
–WebContent
—-META-INF
—-WEB-INFI
——lib
——applicationContext.xml
——web.xml
那麼我們的web.xml需要這麼,配置方式如下:
contextConfigLocation /WEB-INF/applicationContext.xml classpath:resources/services.xml org.springframework.web.context.ContextLoaderListener
contextConfigLocation:
contextConfigLocation指的是Spring該去哪裡讀取配置檔案,ContextLoaderListener用於啟動的web容器(如tomcat)時,去讀取配置檔案並完成Spring容器的初始化(包括載入bean等)。
關於contextConfigLocation的配置方式也是可以非常豐富的,還可以使用萬用字元 * ,這裡簡單舉幾個例子說明:
1. classpath:resources/services.xml
表示到web工程的classes/resources資料夾中查詢配置檔案。
2. classpath*:resources/services.xml
這種方式除了會到classes/resources資料夾查詢,還會到lib下面的jar包中查詢,查詢路徑是jar包內/resources/services.xml。
3. classpath:resouces/**/*services.xml
這種方式表示到classpath的resources資料夾下所有資料夾(不限層級,可以在第N層子資料夾中)中查詢檔名以services.xml結尾的檔案。
4. 多個路徑配置可以用空格分開
classpath知識補充:
web工程部署後,對應war包下的WEB-INF下會有一個classes資料夾和一個lib檔案,當然還有其他的。
其中classes資料夾中的內容是從工程中的原始碼資料夾(對應右鍵工程,Properties - Java Build Path - Source頁籤中看到的資料夾)中編譯過來,lib資料夾即工程中引用的jar包。
這個classes資料夾和lib中的jar都屬於classpath。
ContextLoaderListener:
這個Listener就是在標準Spring Web工程中Spring開始幹活的切入點,為什麼要說標準?因為我們可以寫一個自己的Listener去啟動Spring容器。扯遠了~
因為ContextLoaderListener實現了ServletContextListener,所以在web容器啟動時,ContextLoaderListener就悄悄開始工作了,至於怎麼工作的還需要點篇幅去描述,這篇文就先不細說。
【2】部分資料有時間限制,抓緊時間吧~、