Spring框架:啟動IOC容器的三種方式
前期準備工作
使用IDE:IDEA
建立專案時需要用到的框架有Java和Web
就像下圖的進行勾選。
建立專案完成之後的目錄
如下圖所示。
建立專案時,gradle中用到的依賴:
// Java EE 通過本地Jar包匯入
compile fileTree(dir:'lib',include:['*.jar'])
// Spring 框架
def springVersion = '4.3.10.RELEASE'
compile("org.springframework:spring-aop:$springVersion",
"org.springframework:spring-orm:$springVersion ",
"org.springframework:spring-jdbc:$springVersion",
"org.springframework:spring-instrument-tomcat:$springVersion",
"org.springframework:spring-instrument:$springVersion",
"org.springframework:spring-framework-bom:$springVersion",
"org.springframework:spring-expression:$springVersion ",
"org.springframework:spring-core:$springVersion",
"org.springframework:spring-context-support:$springVersion",
"org.springframework:spring-context:$springVersion",
"org.springframework:spring-beans:$springVersion",
"org.springframework:spring-aspects:$springVersion ",
"org.springframework:spring-test:$springVersion",
"org.springframework:spring-tx:$springVersion",
"org.springframework:spring-web:$springVersion",
"org.springframework:spring-webmvc:$springVersion",
"org.springframework:spring-webmvc-portlet:$springVersion")
// 模擬測試框架
testCompile "org.mockito:mockito-core:2.+"
// 整合測試框架
testCompile 'org.testng:testng:6.8.17'
// 單元測試框架
testCompile group: 'junit', name: 'junit', version: '4.12'
還需要的框架有:Java EE
通過BeanFactory啟動IOC容器
BeanFactory類是Spring框架下最核心的介面,它提供了高階的IOC配置機制。我們可以使用下面的XmlBeanDefinitionReader和DefaultListableBeanFactory類啟動IOC容器。
在com.czuaphe.test包下,建立Car類
bean檔案入在類路徑(classpath)下
在Resource目錄編寫beans.xml檔案生成例項Bean
然後,在test/java目錄下,使用TestNG框架測試一個BeanFactoryTest測試類
通過載入Resource下的beans.xml檔案啟動IOC容器,得到例項Bean。
上圖我們是通過類路徑得到XML檔案的,在gradle下,類路徑就是resources目錄下
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
// 通過類路徑得到資源,以classpath:開頭
Resource resource = resolver.getResource("classpath:beans.xml");
執行結果如下圖所示:
bean檔案放在檔案系統(FileSystem)目錄下
如果我們將beans.xml檔案放在與Car類相同的路徑下:
在test/java目錄下,BeanFactoryTest類中的resouce變數只需要改變一下,就可以達到和上面一樣的結果。
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
Resource resource = resolver.getResource("file:src/main/java/com/czuaphe/test/beans.xml");
通過ApplicationContext類啟動IOC容器
ApplicationContext類繼承了BeanFactory類,實現了更多面嚮應用的功能。
我們就在上例的基礎上,在test/java目錄下,使用TestNG框架再編寫一個ApplicationContextTest類。同樣可以實現像上面兩種載入XML檔案啟動IOC容器的方法,此外,ApplicatioinContext類還可以通過類註解的方式載入Bean啟動IOC容器。
我們實現通過類註解的方式,實現啟動IOC容器。首先,在com.czuaphe.test包下寫Bean.java檔案,編寫例項化Bean的配置。
在ApplicationContextTest類下,實現通過載入類註解配置檔案啟動IOC容器。
另外兩種通過ApplicationContext類啟動IOC容器,也在註釋中寫出了。
通過類註解啟動IOC容器,執行測試的結果如下圖所示:
通過WebApplicationContext類啟動IOC容器
WebApplicationContext類繼承了ApplicationContext類,專門用於Web應用。啟動方式也是通過Web容器啟動,實現IOC容器的啟動。不能簡單通過Java程式碼實現啟動。
在webapp/WEB-INF下的web.xml中定義ContextLoaderListener監聽Web容器的啟動,然後定義contextConfigLocation獲得Spring框架的Bean配置檔案。
然後在web.xml檔案中,再定義一個Servlet,定義它的屬性load-on-startup為1,表示在Web容器和Spring框架的IOC容器啟動之後自啟動,得到WebApplicationContext類的例項,就可以得到Bean例項了。
web.xml檔案如下圖所示
在com.czuaphe.webtest包下,編寫SpringBeanServlet類,重寫Servlet的init()方法,得到WebApplicationContext類的例項。
最後,對此專案配置Tomcat伺服器,在啟動Web容器時,就會啟動Spring的IOC容器,而且會執行自定義的SpringBeanServlet,得到Bean例項。執行結果如下圖所示:
總結
編寫了三種IOC容器的啟動方式,在非Web應用下,使用ApplicationContext啟動IOC容器就已經足夠使用,在Web應用下,就必須在web.xml檔案中配置WebApplicationContext的啟動。讓Web容器啟動時IOC容器也啟動。BeanFactory類啟動IOC容器一般不常用。