上一個單元,我們提到Spring的一個核心功能–IoC container,具體一點來說,Spring採用底下兩種實現方式:
- Bean factory — 提供最基本的dependency injection功能,不過如果我們希望更全面享用 Spring framework所提供的各項支援,bean factories顯然不夠給力
- Application context — 除了涵蓋bean factory的基本功能,更提供包括檔案資源存取、發送與接聽應用程式事件、多國語系…等進階特性,所以在實際運用上我們通常採用Application context
我們先看一下Spring container在啟動時的作業流程:
Jave Reflection api 允許程式在執行時期(runtime)能「動態」地建立物件、改變物件屬性、行為
從上圖可以看出,Spring container在啟動時,會讀取bean的定義檔,然後透過Java Reflection api來建立bean實體,並且注入所依賴的bean。而bean的定義方式有xml、java annotation兩類型式,所以Application context 也大致區分為這兩類:
- Xml
- ClassPathXmlApplicationContext — 從classpath 讀取xml定義檔
1ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); - FileSystemXmlApplicationContext — 從檔案系統讀取xml定義檔
1ApplicationContext context = new FileSystemXmlApplicationContext("c:/myProject/applicationContext.xml");
- ClassPathXmlApplicationContext — 從classpath 讀取xml定義檔
- Annotation
- AnnotationConfigApplicationContext — 讀取java class 裡所標注的 annotation
1ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
- AnnotationConfigApplicationContext — 讀取java class 裡所標注的 annotation
建立ApplicationContext之後,我們就可以使用getBean(Class beanType)或是getBean(String beanName)方法來取得Spring container 裡面某個bean,個人推薦使用getBean(Class beanType)這種寫法,為什麼呢?這邊賣個關子,答案就請大家在底下Api doc 裡面找找囉~~
Facebook Comments