Ioc的本質就是控制權的轉移,將建立對象的責任和依賴管理的責任轉移到容器中去,這方面的文章已經有不少,不清楚爲何須要Ioc的自行了解一下,咱們主要目的是分析Ioc容器的源碼實現,瞭解其運行原理。spring
spring中咱們能夠學到其面向接口的編程思想,其對接口的設計和繼承引人深思,咱們學習其具體實現前,先看下它的接口繼承體系。Ioc容器的核心就是bean的存儲和bean的獲取,所以纔有了後面的接口體系。編程
其核心主要在於一下幾個方法
1.containsBean 判斷bean有沒有
2.getAliases 獲取bean的別名
3.getBean 獲取bean,重點方法
4.getBeanProvider 暫不關注
5.getType 獲取bean的Class信息
6.isTypeMatch bean跟傳入的class是否匹配
getBean就提供了IoC容器的核心功能,bean的獲取,那bean的存儲呢?也是在這裏只不過是採用惰性的方法來建立bean並保存起來app
咱們能夠看到beanfactory的接口繼承體系,其主要直接子接口是HierarchcalBeanFactory,AutowireCapableBeanFactory,ListableBeanFactory三個,至於ApplicationContext後面會說,這個基於IoC容器的基本功能提供了一些高級功能以供上層應用使用,接下來也是先對這三個接口加強介紹一下。ide
public interface HierarchicalBeanFactory extends BeanFactory { @Nullable BeanFactory getParentBeanFactory(); boolean containsLocalBean(String name); }
顧名思義,這是一個能夠繼承的bean工廠,咱們的一個應用也能夠不止一個bean工廠。主要的接口加強
1.getParentBeanFactory 獲取父工廠
2.containsLocalBean 是否包含本地bean
這個接口的子接口中定義了設置父工廠的方法,至於爲何該接口沒有提供呢就交給你們思考了。性能
這個接口提供了一系列自動裝配的功能,裝配模式定義爲幾個常量學習
//不自動裝配 int AUTOWIRE_NO = 0; //按照名字裝配 int AUTOWIRE_BY_NAME = 1; //按照Class裝配 int AUTOWIRE_BY_TYPE = 2; //按照構造器裝配 int AUTOWIRE_CONSTRUCTOR = 3; //智能裝配,不要用! @Deprecated int AUTOWIRE_AUTODETECT = 4; // String ORIGINAL_INSTANCE_SUFFIX = ".ORIGINAL";
1.applyBeanPostProcessorsAfterInitialization
初始化後的回調方法,這裏就要提到bean的生命週期了
2.applyBeanPostProcessorsBeforeInitialization
初始化前的回調方法
3.applyBeanPropertyValues
設置bean的屬性了,處理bean的屬性依賴注入
4.autowire 根據class自動裝配
5.autowireBean 根據bean實例自動裝配
6.autowireBeanProperties 根據bean實例自動裝配屬性
7.configureBean 配置一個bean
8.createBean 建立bean
9.destroyBean 銷燬bean
10.initializeBean 初始化bean
11.resolveBeanByName 解析bean
12.resolveDependency 解析依賴
13.resolveNamedBean 解析已命名beanspa
beanfactory提供了獲取單個bean的能力,那麼這個接口就是提供了獲取一堆bean的能力
1.containsBeanDefinition 是否包含了bean定義,性能不佳,不要頻繁調用
2.findAnnotationOnBean 查找bean上的註解
3.getBeanDefinitionCount 獲取持有的bean定義數目,性能不佳,不要頻繁調用
4.getBeanDefinitionNames 獲取全部的bean定義名稱
5.getBeanNamesForAnnotation 獲取具備指定註解的全部bean的名稱
6.getBeanNamesForType 獲取全部實現了指定class的bean的名稱
7.getBeansOfType 獲取全部具備指定class的bean集合
8.getBeansWithAnnotation 獲取全部具備指定註解的bean集合設計
bean定義是什麼?這些方法的具體實現又是怎麼作的?爲何要這麼設計?這些咱們後面再說。code