1 概述
1.1 依賴反轉模式
在Java中,一個復雜的功能一般都需要由兩個或者兩個以上的類通過彼此合作來實現業務邏輯的,這使得每個對象都需要與其合作的對象的引用。如果這個獲取依賴對象的過程需要自己去實現,那么這將導致代碼的高度偶爾並且難以測試。
依賴反轉就是對象依賴關系的管理被反轉了(獲取依賴對象的方式進行了反轉),以前是自己主動獲取依賴對象,現在是通過框架或者IOC容器將依賴對象注入進來(也可以稱之為依賴注入),將依賴對象的管理轉到了框架或者IOC容器中,極大了降低了代碼之間的耦合性。
1.2 IOC中的注入方式
常見的有接口注入,setter注入和構造器注入三種方式;
相對而言,使用Spring時setter注入是常見的注入方式。
2. IOC容器的設計與實現:BeabFactory和ApplicationContext
Spring IOC 容器的設計中,主要由兩個容器系列
一個是實現BeabFactory接口的簡單容器系列,只實現了容器的基本功能;
一個是ApplicationContext應用上下文,作為容器的高級形態而存在,增加了許多面向框架的特性;
2.1 IOC容器的設計
上圖是IOC容器的接口設計圖,主要包括兩條設計主線:
從BeabFactory接口到HierarchicalFactory接口,再到ConfigurableBeanFactory接口,這是一條主要的BeanFactory設計路線:
在這條設計路線中,BeabFactory定義的容器的基本功能,HierarchicalFactory增加了getParentBeanFactory()的接口功能,使得容器具有雙親IOC容器的管理功能;ConfigurableBeanFactory主要定義了一些對BeabFactory的配置功能。
第二條設計路線是以ApplicationContext接口為核心的接口設計:
在這個接口設計中,通過ListableBeanFactory和HierarchicalFactory連接BeabFactory和ApplicationContext接口定義,ApplicationContext還通過繼承MessageResource接口、ResourceLoder接口和ApplicationEventPublisher接口,添加了許多對高級容器的特性支持。
DefaultListableBeanFactory 是ConfigurableBeanFactory的一個實現類,它作為一個默認的功能完整的IOC容器實現,其他的高級容器都是在它的基礎上進行擴展;
2.2 BeabFactory的應用場景
BeabFactory提供最基本的IOC容器功能,這些功能定義都可以在接口中看到。
XmlBeabFactory是DefaultListableBeanFactory 的子類,它是一個以讀取xml文件方式定義bean的容器。