黃春超
評審人:葛振宇、李文君
-
IOC容器概述:
- 容器是什么
- 在Spring中,org.springframwork.context.ApplicationContext這一接口就代表了Spring IOC容器并且用于創建、配置、管理多個對象,并且還可以控制對象的生命周期,該接口常用的一種實現類就是ClassPathXmlApplicationContext,例如:
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml","daos.xml")
,同時我們可以狹隘地認為一個context對象就對應于一個container。
- 在Spring中,org.springframwork.context.ApplicationContext這一接口就代表了Spring IOC容器并且用于創建、配置、管理多個對象,并且還可以控制對象的生命周期,該接口常用的一種實現類就是ClassPathXmlApplicationContext,例如:
- IOC是什么
- IOC是控制反轉(Inversion of Control)的簡稱,說它是一種技術,其實它更偏向于一種被動獲取的思想。在我們傳統的java中,構造任意一個對象都要通過new這個關鍵字,即當我們要使用到某個類時,我們先要去主動的創建,然后再來使用。而在Spring中,我們只需要通過各種注解或在配置文件中注冊的方式就可以自動生成各種對象,這些對象就是存放在上述所說的容器中,當我們需要使用這些對象的時候,直接從容器中取出相應的對象即可,這種控制方式不僅使得我們更加方便的管理對象,而且還在一定程度上弱化了類和類之間的耦合。總而言之,控制反轉就是一種將原本在程序中手動創建對象的控制權交給Spring框架管理的思想。
- 容器是什么
-
Bean概述:
- Bean是什么
-
Bean的本質就是一個對象,通常來說,所有的bean都是由使用者提供給容器的配置數據所創造的。在容器內部,這些bean都是一個個
BeanDefinition
對象,這些對象都包含下列元數據:- 全限定類名:通常代表該bean對象的實現類的包名加類名
- 行為配置元素:表明該bean在容器中的行為(作用域,生命周期回調函數等)
在基于XML的配置元數據中,我們可以使用
id
或者name
者兩個屬性來指定一個bean對象的名稱,并且我們必須保證在整個容器對象中,各個bean的id值都是唯一的。
-
- Bean是什么
- Bean的實例化
- 構造器實例化:使用該方法創建一個bean對象時,相應的類中應該帶有一個無參數的構造器,其他的屬性通過
set
和get
方法來進行設置或者獲取.除此之外,還需要在配置文件中設置bean
元素的id和class屬性以方便獲取該bean對象。 - 靜態工廠方法實例化:使用該方法時必須先定義一個靜態工廠類,在靜態工廠類中定義一個靜態方法用來返回某個實例化對象。具體代碼如下:
public class ClientService{
private static ClientService service = new ClinetService();
public ClientService(){}
public ClientService createInstance(){return service;}
}
<bean id="service" class="xxx.xxx.ClientService" factory-method="createInstance">
</bean>
- 實例工廠方式實例化:使用該方法創建bean對象時,不需要通過靜態工廠類提供的靜態方法來創建實例,而是先在配置文件中創建一個bean元素作為工廠對象,需要實例化的bean也不是通過class屬性指向其實例化的類,而是通過
factory-bean
指向工廠對象,然后通過使用factory-method
屬性來確定使用工廠對象中的哪個方法。具體配置如下:
<bean id=“serviceLocator” class="examples.DefaultServiceLocator">
</bean>
<bean id="clientService" factory-bean="serviceLocator" factory-method="createClientServiceInstance">
</bean>
上述三種配置都是最簡潔的配置,除此之外,還可以根據實際情況設置bean對象是否為單例、是否需要別名等等。
-
DI概述:
- DI概念
- DI是依賴注入(Dependecy Injection)的簡稱,上述已經提及到IOC是指將對象的創建權反轉給Spring容器,這是一種相對寬泛的概念。而我個人感覺DI就是對這種過程進一步的擴展,DI是指在Spring創建對象的過程中,將對象依賴的一些屬性(常量、對象)通過配置的方式設置給對象。同時,依賴注入讓Spring所管理的bean以配置文件的方式組合在一起,而不是硬編碼的方式耦合在一起,這是一種很好的解耦配置,使得代碼更加偏向于理想中的
高耦合,低內聚
的特性。
- DI是依賴注入(Dependecy Injection)的簡稱,上述已經提及到IOC是指將對象的創建權反轉給Spring容器,這是一種相對寬泛的概念。而我個人感覺DI就是對這種過程進一步的擴展,DI是指在Spring創建對象的過程中,將對象依賴的一些屬性(常量、對象)通過配置的方式設置給對象。同時,依賴注入讓Spring所管理的bean以配置文件的方式組合在一起,而不是硬編碼的方式耦合在一起,這是一種很好的解耦配置,使得代碼更加偏向于理想中的
- 注入方式
- 基于有參構造函數的注入:將一些必要的屬性放在構造函數中,使得bean在實例化時就可以得到相應的設置。使用這種方式注入屬性是,要遵從下列兩個要求:
1.類中必須帶有一個有參數構造器。
2.在配置文件中相對應的bean的<constructor-arg>節點中設置name-value、type-value或者index-value這三種鍵值對方式中的一種來設置,這三種方式分別指通過屬性名設置相應的值、通過屬性類型設置相應的值、通過索引下標匹配設置相應的值。 - 基于屬性的set方法注入:屬性注入要求相對應的bean對象必須要有一個無參數的構造器,并且對象中的每一個字段都具有相對應的
set
方法。在具體的執行過程中,Spring容器在xml配置文件通過反射的方式調用無參數構造器先創建出來一個對象,接著通過set方法將配置好的字段的值設置到該對象中去。
- 基于有參構造函數的注入:將一些必要的屬性放在構造函數中,使得bean在實例化時就可以得到相應的設置。使用這種方式注入屬性是,要遵從下列兩個要求:
- DI概念
-
階段小結:
在Spring的IOC和DI中,我感覺真正在底層起到作用的應該是我們java中的反射機制。xml配置文件中都是一系列字符串,而通過權限定類名來創建實實在在的對象并且給對象初始化等等的一系列過程,就只有反射機制才能做到。同時,我個人感覺閱讀文檔和一些簡單的源碼是一種很好的提升能力的方式。