第2章 Spring Framework的核心:IoC容器的實現
2.1 Spring IoC容器概述
1.IOC容器 和 控制反轉模式。
什么是控制反轉?? 控制反轉就是將對象的控制交給容器去做,而不是在一個對象內部直接控制。是關于一個對象如何獲取它所依賴的對象的引用,反轉指的是責任的反轉。控制的什么被反轉了?就是:獲得依賴對象的方式反轉了。
什么是依賴注入?依賴注入是指容器動態的將某個對象的依賴注入到組件中,注入所需要的外部資源。
“誰依賴誰,為什么需要依賴,誰注入誰,注入了什么”:
●誰依賴于誰:當然是應用程序依賴于IoC容器;
●為什么需要依賴:應用程序需要IoC容器來提供對象需要的外部資源;
●誰注入誰:很明顯是IoC容器注入應用程序某個對象,應用程序依賴的對象;
●注入了什么:就是注入某個對象所需要的外部資源(包括對象、資源、常量數據)。
http://blog.csdn.net/bestone0213/article/details/47424255
2.2 IoC容器系列的實現:BeanFactory和ApplicationContext
BeanFactory 作用:實例化,配置,管理Bean。
/**? ? * 用來引用一個實例,或把它和工廠產生的Bean區分開,就是說,如果一個FactoryBean的名字為a,那么,&a會得到那個Factory? ? */? ? String FACTORY_BEAN_PREFIX = "&";
/*? ? * 四個不同形式的getBean方法,獲取實例? ? */
Object getBean(String name) throws BeansException;
T getBean(String name, ClassrequiredType) throws BeansException;
T getBean(Class requiredType) throws BeansException;
Object getBean(String name, Object... args) throws BeansException;
boolean containsBean(String name); // 是否存在
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;// 是否為單實例
boolean isPrototype(String name) throws NoSuchBeanDefinitionException;// 是否為原型(多實例)
boolean isTypeMatch(String name, Class targetType)
throws NoSuchBeanDefinitionException;// 名稱、類型是否匹配
Class getType(String name) throws NoSuchBeanDefinitionException; // 獲取類型
String[] getAliases(String name);// 根據實例的名字獲取實例的別名
BeanFactory繼承結構:
BeanFactory只提供基本的IOC容器功能。
需要依賴其他的接口來實現功能。例如XmlBeanFactory:
XmlBeanFactory繼承自DefaultListableBeanFactory,擴展了從xml文檔中讀取bean definition的能力。從本質上講,XmlBeanFactory等同于DefaultListableBeanFactory+XmlBeanDefinitionReader ,如果有更好的需求,可以考慮使用DefaultListableBeanFactory+XmlBeanDefinitionReader方案,因為該方案可以從多個xml文件讀取資源,并且在解析xml上具有更靈活的可配置性。典型構造方法:
public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException {
super(parentBeanFactory);
this.reader.loadBeanDefinitions(resource);
}
通過XmlBeanFactory 可以清楚的揭示IOC容器實現中的那先關鍵類(Resource,DefaultListableBeanFactory 和 BeanDefinitionReader)之間的調用關系,他們是如何把IOC容器的功能解耦,又是如何結合在一起為IOC容器服務的。
編程式使用IOC容器:
-----------------------------------------------------------------------------------------------------------------
ClassPathResource res = new ClassPathResource("beans.xml");
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
reader.loadBeanDefinitions(res);
------------------------------------------------------------------------------------------------------------------
1、創建IoC配置文件的抽象資源,這個抽象資源包含了BeanDefinition的定義信息。
2、創建一個BeanFactory,這里使用DefaultListableBeanFactory。
3、創建一個載入BeanDefinition的讀入器,這里使用XmlBeanDefinitionReader來載入XML文件形式的BeanDefinition,通過一個回調配置給BeanFactory。
4、從定義好的資源位置讀入配置信息,具體的解析過程由XmlBeanDefinitionReader來完成。
ClassPathResource
http://www.cnblogs.com/davidwang456/p/4204569.html
2.3 IoC容器的初始化
1.Resoure定位過程;尋找數據
2.BeanDefinition載入過程;
3.向IOC容器注冊BeanDefinition過程;
2.4 IoC容器的依賴注入
2.5 容器其他相關特性的實現
2.6 小結
http://www.cnblogs.com/davidwang456/p/4204569.html
http://www.cnblogs.com/davidwang456/p/4204569.html
http://www.cnblogs.com/davidwang456/p/4204569.html