前言
通过之前对BeanDefinition注册的分析,我们得知,注册的主要类是DefaultListableBeanFactory,那今天我们就分析一下DefaultListableBeanFactory的实现关系。
类图
![](https://img.haomeiwen.com/i12651314/997de442091f080f.png)
我们从上层的顶级接口开始梳理,如果想知道DefaultListableBeanFactory都可以干什么,需要知道上层的接口都定义了什么。
我们可以关注这样几个类:BeanFactory/HierarchicalBeanFactory/ListableBeanFactory/ConfigurableBeanFactory/AutowireCapableBeanFactory/AbstractBeanFactory/AbstractAutowireCapableBeanFactory
这些都梳理后,我们就可以了解了DefaultListableBeanFactory都可以干什么了。
源码分析
BeanFactory
![](https://img.haomeiwen.com/i12651314/13cfe68d9c6f89f2.png)
从图中,可以看出来,此接口定义了获取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
(关于FactoryBean,以后再来讨论,现在可以认为是一个特殊的Spring的实现方式)
HierarchicalBeanFactory
可以获取父容器的相关BeanFactory
ListableBeanFactory
BeanFactory接口定义的都是对于一个Bean的获取和判断操作,此接口则定义了批量的Bean获取和判断操作:
![](https://img.haomeiwen.com/i12651314/44667e82ad05bc61.png)
比如:
- getBeanDefinitionCount:获取所有BeanDefinition的个数
- getBeanNamesForType: 获取所有此类型的BeanName
- getBeanNamesForAnnotation: 获取此注解下的所有 BeanName
不一一举例了,都是对于BeanDefinition的批量操作的扩展。
ConfigurableBeanFactory
public interface ConfigurableBeanFactory extends HierarchicalBeanFactory, SingletonBeanRegistry {
//代码省略
}
它拥有了HierarchicalBeanFactory和SingletonBeanRegistry(单例注册)的功能。
![](https://img.haomeiwen.com/i12651314/8bb17f3fe5539ee4.png)
AutowireCapableBeanFactory
对于已存在的Bean进行装配暴露,多用于集成其他框架使用:
![](https://img.haomeiwen.com/i12651314/a0e2c87d6016edd6.png)
ConfigurableListableBeanFactory
public interface ConfigurableListableBeanFactory
extends ListableBeanFactory, AutowireCapableBeanFactory, ConfigurableBeanFactory {
}
ConfigurableListableBeanFactory拥有了ListableBeanFactory/AutowireCapableBeanFactory/ConfigurableBeanFactory功能以外,还提供了一些扩展的功能:比如分析和修改BeanDefinition的一些功能。
AbstractBeanFactory、AbstractAutowireCapableBeanFactory
通过类图,得知,AbstractBeanFactory一定是可配置BeanFactory和注入BeanDefinition的是一个抽象模板类。
AbstractAutowireCapableBeanFactory在 AbstractBeanFactory的基础上,增加了可装配的功能(AutowireCapableBeanFactory).
当然,今天梳理的都是接口关系,和接口的能力,具体实现,之后再进行分析。
DefaultListableBeanFactory
此时再来看这个类,会清晰很多。
首先它本身就是一个BeanDefinitionRegistry,可以完成注册功能。
再次,它是一个有层次的工厂类实现,因为它实现了AutowireCapableBeanFactory,且因为它实现了很多BeanDefinition的操作功能(BeanFactory:单个Bean的操作,ListableBeanFactory:批量Bean的操作)
ok,现在我们已经对DefaultListableBeanFactory的能力进行了一个大概的梳理。
小结
对于关键的工厂类DefaultListableBeanFactory,我们进行了一个非常详细的梳理。
当然,今天不涉及具体的实现,以后可以再对实现进行研究。
网友评论