Spring容器和應用上下文理解
如果你想要了解Spring深一些,而不僅僅是拿來用用,那麼你就應該好好思考一下上訴問題,不然,這篇博文你還看個剷剷啊。。。你可以這樣去思考:Spring既然要負責應用程式中那麼多物件的建立管理,就像蘋果要生產那麼多的手機(物件)一樣,肯定有一個專門搞物件的地方。蘋果生產手機的地方叫工廠,比如富士康,但放在軟體開發中,對於Spring搞物件的地方我們就不叫工廠了,而叫做容器。是的,容器的概念在java中你最熟悉的莫過於Tomcat了,它正是一個執行Servlet的web容器,而Spring要想實現依賴注入功能,就離不開物件生產的容器——如果沒有容器負責物件的建立管理,你的程式程式碼只是喊要物件了,Spring也無處給你啊。實際上,容器是Spring框架實現功能的核心
好了,終於把Spring的容器概念闡述的差不多了,但有什麼卵用呢?光有容器你其實什麼都幹不了!你以為容器那麼科幻,跟叮噹貓面前的百寶袋一樣,你想要啥它就給你啥?實際上,容器裡面什麼都沒有,決定容器裡面放什麼物件的是我們自己,決定物件之間的依賴關係的,也是我們自己,容器只是給我們提供一個管理物件的空間而已。那麼,我們怎麼向容器中放入我們需要容器代為管理的物件呢?這就涉及到Spring的應用上下文
① AnnotationConfigApplicationContext:從一個或多個基於java的配置類中載入上下文定義,適用於java註解的方式;
② ClassPathXmlApplicationContext:從類路徑下的一個或多個xml配置檔案中載入上下文定義,適用於xml配置的方式;
③ FileSystemXmlApplicationContext:從檔案系統下的一個或多個xml配置檔案中載入上下文定義,也就是說系統碟符中載入xml配置檔案;
④ AnnotationConfigWebApplicationContext:專門為web應用準備的,適用於註解方式;
⑤ XmlWebApplicationContext:從web應用下的一個或多個xml配置檔案載入上下文定義,適用於xml配置方式。
有了以上理解,問題就很好辦了。你只要將你需要IOC容器替你管理的物件基於xml也罷,java註解也好,總之你要將需要管理的物件(Spring中我們都稱之問bean)、bean之間的協作關係配置好,然後利用應用上下文物件載入進我們的Spring容器,容器就能為你的程式提供你想要的物件管理服務了。下面,還是貼一下簡單的應用上下文的應用例項:
我們先採用xml配置的方式配置bean和建立bean之間的協作關係:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"> <bean id="man" class="spring.chapter1.domain.Man"> <constructor-arg ref="qqCar" /> </bean> <bean id="qqCar" class="spring.chapter1.domain.QQCar"/> </beans>
然後通過應用上下文將配置載入到IOC容器,讓Spring替我們管理物件,待我們需要使用物件的時候,再從容器中獲取bean就ok了:
public class Test { public static void main(String[] args) { //載入專案中的spring配置檔案到容器 // ApplicationContext context = new ClassPathXmlApplicationContext("resouces/applicationContext.xml"); //載入系統盤中的配置檔案到容器 ApplicationContext context = new FileSystemXmlApplicationContext("E:/Spring/applicationContext.xml"); //從容器中獲取物件例項 Man man = context.getBean(Man.class); man.driveCar(); } }
以上測試中,我將配置檔案applicationContext.xml分別放在專案中和任意的系統碟符下,我只需要使用相應的上下文物件去載入配置檔案,最後的結果是完全一樣的。當然,現在專案中越來越多的使用java註解,所以註解的方式必不可少:
//同xml一樣描述bean以及bean之間的依賴關係 @Configuration public class ManConfig { @Bean public Man man() { return new Man(car()); } @Bean public Car car() { return new QQCar(); } }
public class Test { public static void main(String[] args) { //從java註解的配置中載入配置到容器 ApplicationContext context = new AnnotationConfigApplicationContext(ManConfig.class); //從容器中獲取物件例項 Man man = context.getBean(Man.class); man.driveCar(); } }