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