Spring水滴石穿(一) BeanFactory體系

IoC

Ioc的本質就是控制權的轉移,將建立對象的責任和依賴管理的責任轉移到容器中去,這方面的文章已經有不少,不清楚爲何須要Ioc的自行了解一下,咱們主要目的是分析Ioc容器的源碼實現,瞭解其運行原理。spring

面向接口編程

spring中咱們能夠學到其面向接口的編程思想,其對接口的設計和繼承引人深思,咱們學習其具體實現前,先看下它的接口繼承體系。Ioc容器的核心就是bean的存儲和bean的獲取,所以纔有了後面的接口體系。編程

BeanFactory

beanfactory實現
其核心主要在於一下幾個方法
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

image
咱們能夠看到beanfactory的接口繼承體系,其主要直接子接口是HierarchcalBeanFactory,AutowireCapableBeanFactory,ListableBeanFactory三個,至於ApplicationContext後面會說,這個基於IoC容器的基本功能提供了一些高級功能以供上層應用使用,接下來也是先對這三個接口加強介紹一下。ide

HierarchcalBeanFactory

public interface HierarchicalBeanFactory extends BeanFactory {
    @Nullable
    BeanFactory getParentBeanFactory();

    boolean containsLocalBean(String name);
}

顧名思義,這是一個能夠繼承的bean工廠,咱們的一個應用也能夠不止一個bean工廠。主要的接口加強
1.getParentBeanFactory 獲取父工廠
2.containsLocalBean 是否包含本地bean
這個接口的子接口中定義了設置父工廠的方法,至於爲何該接口沒有提供呢就交給你們思考了。性能

AutowireCapableBeanFactory

image
這個接口提供了一系列自動裝配的功能,裝配模式定義爲幾個常量學習

//不自動裝配
    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

ListableBeanFactory

beanfactory提供了獲取單個bean的能力,那麼這個接口就是提供了獲取一堆bean的能力image
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

相關文章
相關標籤/搜索