IOC(控制反轉)是Spring框架中最核心的機制,因此咱們須要對其實現原理有必定的理解,才能更好的使用它甚至本身設計一個相似Spring的簡單框架。這篇文章咱們先無論其運行流程,而是先來看一下他的兩個重要的接口,只有先把這些接口弄明白了,咱們才能理解IOC機制的工做流程及原理。java
package org.springframework.beans.factory;
import org.springframework.beans.BeansException;
public interface BeanFactory {
String FACTORY_BEAN_PREFIX = "&";
Object getBean(String name) throws BeansException;
T getBean(String name, Class requiredType) 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只是個接口,並非IOC容器的具體實現,可是Spring容器給出了不少種實現,如 DefaultListableBeanFactory、XmlBeanFactory、ApplicationContext等,其中XmlBeanFactory就是經常使用的一個,該實現將以XML方式描述組成應用的對象及對象間的依賴關係。XmlBeanFactory類將持有此XML配置元數據,並用它來構建一個徹底可配置的系統或應用。web
它由BeanFactory接口派生而來,ApplicationContext包含BeanFactory的全部功能,一般建議比BeanFactory優先。spring
ApplicationContext以一種更向面向框架的方式工做以及對上下文進行分層和實現繼承,ApplicationContext包還提供瞭如下的功能:框架
我目前想到的,只須要知足以上三種條件,即可以建立一個bean工廠,來生產各類bean。固然,spring確定有更高級的作法,以上只是我直觀的去想如何實現IOC。函數
那麼從上面的描述中,我又引伸出了另外一個核心問題,Bean的定義是什麼,他的依賴關係又如何描述?工具
那麼答案是,一個祖宗級別的接口,來看BeanDefinition。ui
package org.springframework.beans.factory.config;
import org.springframework.beans.BeanMetadataElement;
import org.springframework.beans.MutablePropertyValues;
import org.springframework.core.AttributeAccessor;
public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {
String SCOPE_SINGLETON = ConfigurableBeanFactory.SCOPE_SINGLETON;
String SCOPE_PROTOTYPE = ConfigurableBeanFactory.SCOPE_PROTOTYPE;
int ROLE_APPLICATION = 0;
int ROLE_SUPPORT = 1;
int ROLE_INFRASTRUCTURE = 2;
String getParentName();
void setParentName(String parentName);
String getBeanClassName();
void setBeanClassName(String beanClassName);
String getFactoryBeanName();
void setFactoryBeanName(String factoryBeanName);
String getFactoryMethodName();
void setFactoryMethodName(String factoryMethodName);
String getScope();
void setScope(String scope);
boolean isLazyInit();
void setLazyInit(boolean lazyInit);
String[] getDependsOn();
void setDependsOn(String[] dependsOn);
boolean isAutowireCandidate();
void setAutowireCandidate(boolean autowireCandidate);
boolean isPrimary();
void setPrimary(boolean primary);
ConstructorArgumentValues getConstructorArgumentValues();
MutablePropertyValues getPropertyValues();
boolean isSingleton();
boolean isPrototype();
boolean isAbstract();
int getRole();
String getDescription();
String getResourceDescription();
BeanDefinition getOriginatingBeanDefinition();
}複製代碼
BeanDefinition這個接口即是spring中的bean定義接口,因此其實咱們工廠裏持有的bean定義,就是一堆這個玩意,或者是他的實現類和子接口。這個接口並不是直接的祖宗接口,他所繼承的兩個接口一個是core下面的AttributeAccessor,繼承這個接口就覺得這咱們的bean定義接口一樣具備處理屬性的能力,而另一個是beans下面的BeanMetadataElement,這個接口就是bean的元數據元素,它能夠得到bean的配置定義的一個元素。在XML文件中來講,就是會持有一個bean標籤。spa
本篇文章介紹了Spring實現IOC這一機制的最基礎的兩個接口BeanFactory和BeanDefinition。一個是生產Bean的工廠,一個是對Bean的定義,這兩個接口以最基礎的形式定義了Bean是什麼以及是如何產生的,Spring在實際應用中使用的類或者接口不少也都是實現了這兩個接口,如ApplicationContext、ChildBeanDefinition等等。設計