這篇文章將為大家詳細講解有關怎樣進行Spring中IOC容器的概述與設計,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
目前成都創新互聯公司已為上千家的企業提供了網站建設、域名、網頁空間、網站托管運營、企業網站設計、巴彥淖爾網站維護等服務,公司將堅持客戶導向、應用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協力一起成長,共同發展。
在依賴反轉時實際是依賴對象的獲得被反轉了。
如果合作對象的引用或依賴關系的管理由具體對象來完成,會導致代碼高耦合和可測試性降低,而在面向對象系統中,對象封裝了數據和對數據的處理,對象的依賴關系常常在于對數據和方法的依賴,因此把對象的依賴注入交給框架和IoC容器來完成,解耦的同時可以提高代碼的可測試性.
在Spring中IoC容器是實現依賴反轉的載體,它可以讓對象在生成或對象初始化時直接將數據注入到對象中;也可以通過將對象的引用注入到對象數據域中從而實現注入對方法調用的依賴.這種依賴注入可以遞歸的將對象逐層注入。
通過使用IoC容器,對象依賴關系的管理被反轉了,轉到IoC容器中來了,對象之間的相互依賴關系由IoC容器進行管理,并由IoC容器完成對象的注入。
在Spring IoC容器的設計中,可以看到二個主要的容器系列,一個是實現BeanFactory接口的簡單容器系列,這系列容器只實現了容器的基本功能;
另一個是ApplicationContext應用上下文,作為容器的高級形態而存在.它在簡單容器的基礎上,增加了許多面向框架的特性,對應用環境進作了許多適配.
IoC容器的主要接口設計圖如下圖所示:
由上圖可以看出IoC容器接口有二條設計路線:
從接口BeanFactory到HierarchicalBeanFactory,再到ConfigableBeanFactory是一條主要的設計路線。
另一條是以ApplicationContext應用上下文接口為核心的接口設計路線。從BeanFactory到ListableBeanFactory及HierarchicalBeanFactory,再到ApplicationContext,再到常用的WebApplicationContext或ConfigableApplicationContext。
圖中綠色部分,為部分抽象類及接口實現類,暫不研究。
對于第一條接口設計路線,BeanFactory定義了基本的容器設計規范,HierarchicalBeanFactory繼承了BeanFactory基本接口之后,增加了getParentBeanFactory()接口功能,使BeanFactory具備了雙親IoC容器的管理功能。而后面的ConfigableBeanFactory主要定義了一些BeanFactory的配置功能(如通過setParentBeanFacory()設置雙親IoC容器等)。通過這些功能的疊加就定義了BeanFactory簡單IoC容器的基本功能。
對于第二條接口設計路線,ListableBeanFactory及HierarchicalBeanFactory是連接BeanFactory及ApplicationContext的接口;在ListableBeanFactory接口中細化了許多BeanFactory接口的功能,在HierarchicalBeanFactory接口中增加了getParentBeanFactory()接口功能,使BeanFactory具備了雙親IoC容器的管理功能;對于ApplicationContext接口,通過繼承ResourcePatternResolver,ApplicationEventPublisher,MessageSource等接口,在BeanFactory簡單容器的基礎上增加了許多對高級容器特性的支持。
public interface BeanFactory {
String FACTORY_BEAN_PREFIX = "&"; //如果以&開始則獲取FactoryBean本身;否則獲取FactoryBean創建的實例.
//獲取Bean
Object getBean(String name) throws BeansException;//可以是別名
<T> T getBean(String name, Class<T> requiredType) throws BeansException;
Object getBean(String name, Object... args) throws BeansException;
<T> T getBean(Class<T> requiredType) throws BeansException;
<T> T getBean(Class<T> requiredType, Object... args) throws BeansException;
//判斷是否包含bean。不管是抽象類,懶加載,是否在容器范圍內,只要符合都返回true。所以返回true時,不一定能從getBean獲取實例
boolean containsBean(String name);
//單例,原型,bean類型的判斷
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException;
//獲取bean 的類型,別名
Class<?> getType(String name) throws NoSuchBeanDefinitionException;
String[] getAliases(String name);
}以XmlBeanFactory為例,來說明簡單IoC容器BeanFactory的設計原理。

可以看出XmlBeanFactory繼承自DefaultListableBeanFactory,在Spring中實際上是把DefaultListableBeanFactory作為一個功能完整的IoC容器來使用的。
public class XmlBeanFactory extends DefaultListableBeanFactory {
private final XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this);
public XmlBeanFactory(Resource resource) throws BeansException {
this(resource, null);
}
public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException {
super(parentBeanFactory);
this.reader.loadBeanDefinitions(resource);
}
}從XmlBeanFactory的名字上可以看出,它是一個可以讀取以XML文件方式定義的BeanDefinition的IoC容器。
在XmlBeanFactory中初始化了一個XmlBeanDefinitionReader對象,用來處理以XML文件方式定義的BeanDefinition。
構造XmlBeanFactory這個IoC容器時需要指定XML信息來源,這個信息來源需要封裝成Spring的Resource類。
通過xml文件位置構造出Resource,然后將Resource傳入XmlBeanFactory的構造函數。這樣IoC容器就可以定位到需要的BeanDefinition信息來完成容器的初始化和依賴注入過程。
參考XmlBeanFactory的實現,我們以編程的方式使用DefaultListableBeanFactory來進行總結。
public void mytest(){
ClassPathResource resource = new ClassPathResource("applicationContext.xml");
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(factory);
System.out.println(beanDefinitionReader.loadBeanDefinitions(resource));
Person p = (Person) factory.getBean("personChild");
System.out.println(p);
}發現再使用 IoC容器時需要以下幾個步驟:
創建IoC容器的抽象資源,這個抽象資源定義了BeanDefinition的定義信息。
創建一個BeanFactory。這里是DefaultListableBeanFactory。
創建一個BeanDefinition的讀取器,通過一個回調配置給BeanFactory。這里是XmlBeanDefinitionReader。
從定義好的資源位置讀入配置信息,具體的解析過程由XmlBeanDefinitionReader來完成。完成整個載入和注冊Bean定義后,就可以使用IoC容器了。
ApplicationContext的接口關系:如下圖所示。

可以看出ApplicationContext在BeanFactory的基礎上增加了許多附加功能,為ApplicationContext提供了許多新特新,所以說,ApplicationContext在BeanFactory是一個高級形態意義的IoC容器。
在ApplicationContext在BeanFactory容器中,以FileSystemXMLApplicationContext實現為例來說明ApplicationContext在BeanFactory容器的設計原理。
FileSystemXMLApplicationContext的源代碼如下:
public class FileSystemXmlApplicationContext extends AbstractXmlApplicationContext {
public FileSystemXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent)
throws BeansException {
super(parent);
setConfigLocations(configLocations);
//這個refresh操作會牽涉IoC容器啟動的一系列操作。對不同的容器操作都是類似的,因此在基類中將他們封裝好。
if (refresh) {
refresh();
}
}
@Override
protected Resource getResourceByPath(String path) {
if (path != null && path.startsWith("/")) {
path = path.substring(1);
}
return new FileSystemResource(path);
}
}由代碼可以看出主要功能已經在基類AbstractXmlApplicationContext中實現了,在FileSystemXmlApplicationContext中只需要二個與自身設計有關的功能。
應用直接使用FileSystemXmlApplicationContext容器時,對于實例化這個應用上下文的支持,及啟動IoC容器的refresh功能。
不同的容器實現對應著不同BeanDefinition讀取實現,在FileSystemXmlApplicationContext的讀取BeanDefinition實現如上面的代碼所示。
關于怎樣進行Spring中IOC容器的概述與設計就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
網站題目:怎樣進行Spring中IOC容器的概述與設計
URL鏈接:http://www.yijiale78.com/article20/ihojco.html
成都網站建設公司_創新互聯,為您提供App設計、網站制作、網站策劃、動態網站、域名注冊、微信公眾號
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯