基本上spring使用的beanFactory都是DefaultListableBeanFactory。
先看这个类的继承关系图:
类名 | 作用 |
---|---|
AliasResgistry | 定义对alias简单的增删改操作 |
SimpleAliasRegistry | 使用map作为alias的缓存,并对接口AliasRegistry实现 |
SingletonBeanRegistry | 定义了对单例的注册和获取 |
DefaultSingletonBeanRegistry | 对接口SingletonRegistry的实现 |
BeanFactory | 定义获取Bean和Bean的各种属性 |
HierarchicalBeanFactory | 继承BeanFactory,增加了对parentFactory的支持 |
BeanDefinitionRegistry | 增加了对BeanDefinition的增删改 |
FactoryBeanRegistrySupport | 增加了对FactoryBean的特殊处理 |
ConfigurableBeanFactory | 提供了对BeanFactory的配置方法 |
ListableBeanFactory | 根据各种条件获取bean的清单 |
AbstractBeanFactory | 综合ConfigurableBeanFactory 和FactoryBeanRegistrySupport 的功能 |
AutowireCapableBeanFactory | 提供创建Bean、自动注入、初始化以及应用bean后的处理器 |
AbstractAutowireCapableBeanFactory | 综合AbstractBeanFactory 并对AutowireCapableBeanFactory 做了实现 |
ConfigurableListableBeanFactory | 配置清单、指定忽略类型和接口 |
DefaultListableBeanFactory | 实现了以上所有功能 ,主要是bean注册后的处理 |
一般使用的是DefaultListableBeanFactory这个类
类中定义了8个内部类
类名 | 作用 |
---|---|
DependencyObjectProvider | |
FactoryAwareOrderSourceProvider | |
Jsr330DependencyProvider | |
Jsr330ProviderFactory | |
MultiElementDescriptor | |
NestedDependencyDescriptor | |
OptionalDependencyFactory | |
SerializedBeanFactoryReference |
定义的字段:
定义的方法:
AbstractAutowireCapableBeanFactory中,有构造方法:
public AbstractAutowireCapableBeanFactory() {
this.instantiationStrategy = new CglibSubclassingInstantiationStrategy();
this.parameterNameDiscoverer = new DefaultParameterNameDiscoverer();
this.allowCircularReferences = true;
this.allowRawInjectionDespiteWrapping = false;
this.ignoredDependencyTypes = new HashSet();
this.ignoredDependencyInterfaces = new HashSet();
this.factoryBeanInstanceCache = new ConcurrentHashMap(16);
this.filteredPropertyDescriptorsCache = new ConcurrentHashMap(256);
this.ignoreDependencyInterface(BeanNameAware.class);
this.ignoreDependencyInterface(BeanFactoryAware.class);
this.ignoreDependencyInterface(BeanClassLoaderAware.class);
}
ignoreDependencyInterface的作用是忽略指定接口的自动装配功能,比如说A中有属性B,在获取A的Bean时,B还没有实例化,spring会自动实例化B。如果把类B添加到ignoreDependencyInterface中,那么类B就不会被实例化。
XmlBeanFactory使用private final XmlBeanDefinitionReader reader;来读取beanDefinition,这个类在第三篇中有细说。
类中只有2个构造方法,没有其他的东西,关于Resource这个类在第四篇中有说到。
public XmlBeanFactory(Resource resource) throws BeansException {
this(resource, (BeanFactory)null);
}
public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException {
super(parentBeanFactory);
this.reader = new XmlBeanDefinitionReader(this);
this.reader.loadBeanDefinitions(resource);
}
spring创建beanFactory,是使用refreshBeanFactory方法创建的,这个方法核心的一步是loadBeanDefinitions(beanFactory);
protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
this.refreshBeanFactory();
ConfigurableListableBeanFactory beanFactory = this.getBeanFactory();
return beanFactory;
}
protected final void refreshBeanFactory() throws BeansException {
if(this.hasBeanFactory()) {
this.destroyBeans();
this.closeBeanFactory();
}
try {
//普通的对象创建---如果有父context,就把父context的beanfactory
DefaultListableBeanFactory beanFactory = this.createBeanFactory();
//直接使用context的id
beanFactory.setSerializationId(this.getId());
//设置是否允许bean重复定义-allowBeanDefinitionOverriding
//设置是否允许bean循环引用--allowCircularReferences
this.customizeBeanFactory(beanFactory);
this.loadBeanDefinitions(beanFactory);
Object var2 = this.beanFactoryMonitor;
synchronized(this.beanFactoryMonitor) {
this.beanFactory = beanFactory;
}
} catch (IOException var5) {
}
}
loadBeanDefinitions(beanFactory)方法,这个方法除了创建对象外,又把主要逻辑放在了loadBeanDefinitions上。
protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws BeansException, IOException {
XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);
beanDefinitionReader.setEnvironment(this.getEnvironment());
beanDefinitionReader.setResourceLoader(this);
beanDefinitionReader.setEntityResolver(new ResourceEntityResolver(this));
this.initBeanDefinitionReader(beanDefinitionReader);
this.loadBeanDefinitions(beanDefinitionReader);
}
这个方法使用XmlBeanDefinitionReader解析spring的xml配置文件,具体解析在其他文章中。
protected void loadBeanDefinitions(XmlBeanDefinitionReader reader) throws IOException {
String[] configLocations = this.getConfigLocations();
if(configLocations != null) {
String[] var3 = configLocations;
int var4 = configLocations.length;
for(int var5 = 0; var5 < var4; ++var5) {
String configLocation = var3[var5];
reader.loadBeanDefinitions(configLocation);
}
}
}