首先咱們來認識下IOC和DI:spring
思考如下問題:安全
接下來咱們看Spring是怎麼作到的。 ui
1.BeanFactory spa
Spring使用工廠模式建立Bean,這一系列的Bean工廠,也即IOC 容器,爲開發者管理對象間的依賴關係提供了不少便利和基礎服務。Spring中有許多IOC 容器的實現供選擇和使用,其相互關係以下: code
BeanFactory做爲最頂層的一個接口類,定義了IOC容器的基本功能規範,BeanFactory 有三個子類:ListableBeanFactory、HierarchicalBeanFactory和AutowireCapableBeanFactory。最終的默認實現類是DefaultListableBeanFactory,他實現了全部的接口。 xml
爲什麼要定義這麼多層次的接口呢?查閱這些接口的源碼和說明發現,每一個接口都有他使用的場合,主要是爲了區分在Spring內部在操做過程當中對象的傳遞和轉化過程當中,對對象的數據訪問所作的限制。例如ListableBeanFactory接口表示這些Bean是可列表的,HierarchicalBeanFactory表示這些 Bean是有繼承關係的,也就是每一個Bean有可能有父Bean。AutowireCapableBeanFactory接口定義 Bean的自動裝配規則。這四個接口共同定義了Bean的集合、Bean之間的關係、Bean的行爲。 對象
咱們看一下BeanFactory源碼裏的方法:blog
public interface BeanFactory { // 對FactoryBean的轉義定義,由於若是使用bean的名字檢索FactoryBean獲得的對象是工廠生成的對象, // 若是須要獲得工廠自己,須要轉義 String FACTORY_BEAN_PREFIX = "&"; // 根據bean的名字,獲取在IOC容器中獲得bean實例 Object getBean(String name) throws BeansException; // 根據bean的名字和Class類型來獲得bean實例,增長了類型安全驗證機制。 <T> T getBean(String name, @Nullable 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的檢索,看看是否在IOC容器有這個名字的bean boolean containsBean(String name); // 根據bean名字獲得bean實例,並同時判斷這個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, @Nullable Class<?> typeToMatch) throws NoSuchBeanDefinitionException; // 獲得bean實例的Class類型 @Nullable Class<?> getType(String name) throws NoSuchBeanDefinitionException; // 獲得bean的別名,若是根據別名檢索,那麼其原名也會被檢索出來 String[] getAliases(String name); }
對於FACTORY_BEAN_PREFIX,這裏解釋如下:與BeanFactory很類似的有一個叫FactoryBean的類,從名字上很容易混淆,BeanFactory首先是Factory,而FactoryBean是bean,是一種特殊的bean, 這種特殊的bean會生產另外一種bean, 對於普通的bean,經過BeanFactory的getBean方法能夠獲取這個bean,而對於FactoryBean來講,經過getBean得到的是FactoryBean生產的bean,而不是FactoryBean自己,若是想要獲取FactoryBean自己,那麼能夠加前綴&,spring就會明白,原來是須要FactoryBean 。 繼承
BeanFactory只對IOC容器的基本行爲做了定義,不用關心Bean是如何定義怎樣加載的。
要知道工廠是如何產生對象的,須要看具體的IOC 容器實現,Spring 提供了許多 IOC 容器的實現。好比XmlBeanFactory,ClasspathXmlApplicationContext 等。其中 XmlBeanFactory是針對最基本的IOC容器的實現,這個IOC 容器能夠讀取XML文件定義的BeanDefinition(XML文件中對bean的描述)。ApplicationContext是Spring提供的一個高級的IOC 容器,它除了可以提供IOC容器的基本功能外,還爲用戶提供瞭如下的附加服務:接口
2.BeanDefinition
SpringIOC容器管理了咱們定義的各類Bean對象及其相互的關係,Bean對象在Spring實現中是
以BeanDefinition來描述的,其繼承體系以下:
Bean的解析過程很是複雜,功能被分的很細。Bean的解析主要是對Spring配置文件的解析。解析過程主要經過下圖中的類完成: