前言
通過之前對BeanDefinition注冊的分析,我們得知抛人,注冊的主要類是DefaultListableBeanFactory,那今天我們就分析一下DefaultListableBeanFactory的實現(xiàn)關(guān)系。
類圖
我們從上層的頂級接口開始梳理脐瑰,如果想知道DefaultListableBeanFactory都可以干什么函匕,需要知道上層的接口都定義了什么。
我們可以關(guān)注這樣幾個類:BeanFactory/HierarchicalBeanFactory/ListableBeanFactory/ConfigurableBeanFactory/AutowireCapableBeanFactory/AbstractBeanFactory/AbstractAutowireCapableBeanFactory
這些都梳理后蚪黑,我們就可以了解了DefaultListableBeanFactory都可以干什么了盅惜。
源碼分析
BeanFactory
從圖中,可以看出來忌穿,此接口定義了獲取Bean的公眾方式抒寂,以及Bean的一些基本信息判斷,比如isSingleton/isPrototype/isTypeMatch
還有一個需要注意的地方掠剑,看這個常量:
String FACTORY_BEAN_PREFIX = "&";
如果我們在獲取Bean的時候屈芜,使用&則獲取的是FactoryBean本身對象,否則是獲取getObject的代理對象。
看個例子:
public class Test {
public static void main(String[] args) throws Exception {
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
beanFactory.registerBeanDefinition("springBean",new RootBeanDefinition(PersonFactoryBean.class));
System.out.println(beanFactory.getBean("springBean"));
System.out.println(beanFactory.getBean("&springBean"));
}
static class PersonFactoryBean implements FactoryBean<Person>{
@Override
public Person getObject() throws Exception {
return new Person();//可以做代理操作
}
@Override
public Class<?> getObjectType() {
return Person.class;
}
@Override
public boolean isSingleton() {
return true;
}
}
@Data
static class Person {
private String name;
}
}
輸出 :
Test.Person(name=null)
Test$PersonFactoryBean@1f5a0bc0
(關(guān)于FactoryBean井佑,以后再來討論属铁,現(xiàn)在可以認為是一個特殊的Spring的實現(xiàn)方式)
HierarchicalBeanFactory
可以獲取父容器的相關(guān)BeanFactory
ListableBeanFactory
BeanFactory接口定義的都是對于一個Bean的獲取和判斷操作,此接口則定義了批量的Bean獲取和判斷操作:
比如:
- getBeanDefinitionCount:獲取所有BeanDefinition的個數(shù)
- getBeanNamesForType: 獲取所有此類型的BeanName
- getBeanNamesForAnnotation: 獲取此注解下的所有 BeanName
不一一舉例了躬翁,都是對于BeanDefinition的批量操作的擴展焦蘑。
ConfigurableBeanFactory
public interface ConfigurableBeanFactory extends HierarchicalBeanFactory, SingletonBeanRegistry {
//代碼省略
}
它擁有了HierarchicalBeanFactory和SingletonBeanRegistry(單例注冊)的功能。
AutowireCapableBeanFactory
對于已存在的Bean進行裝配暴露盒发,多用于集成其他框架使用:
ConfigurableListableBeanFactory
public interface ConfigurableListableBeanFactory
extends ListableBeanFactory, AutowireCapableBeanFactory, ConfigurableBeanFactory {
}
ConfigurableListableBeanFactory擁有了ListableBeanFactory/AutowireCapableBeanFactory/ConfigurableBeanFactory功能以外例嘱,還提供了一些擴展的功能:比如分析和修改BeanDefinition的一些功能。
AbstractBeanFactory宁舰、AbstractAutowireCapableBeanFactory
通過類圖拼卵,得知,AbstractBeanFactory一定是可配置BeanFactory和注入BeanDefinition的是一個抽象模板類蛮艰。
AbstractAutowireCapableBeanFactory在 AbstractBeanFactory的基礎(chǔ)上腋腮,增加了可裝配的功能(AutowireCapableBeanFactory).
當然,今天梳理的都是接口關(guān)系壤蚜,和接口的能力低葫,具體實現(xiàn),之后再進行分析仍律。
DefaultListableBeanFactory
此時再來看這個類嘿悬,會清晰很多。
首先它本身就是一個BeanDefinitionRegistry水泉,可以完成注冊功能善涨。
再次,它是一個有層次的工廠類實現(xiàn)草则,因為它實現(xiàn)了AutowireCapableBeanFactory,且因為它實現(xiàn)了很多BeanDefinition的操作功能(BeanFactory:單個Bean的操作钢拧,ListableBeanFactory:批量Bean的操作)
ok,現(xiàn)在我們已經(jīng)對DefaultListableBeanFactory的能力進行了一個大概的梳理炕横。
小結(jié)
對于關(guān)鍵的工廠類DefaultListableBeanFactory源内,我們進行了一個非常詳細的梳理。
當然份殿,今天不涉及具體的實現(xiàn),以后可以再對實現(xiàn)進行研究卿嘲。