SpringFramework源码剖析——DefaultListableBeanFactory
大家都知道Spring框架主要提供了IoC与AOP两种能力,而IoC能力主要涉及到Bean的注册,AOP更多的是与上下文相关的配置。Bean的注册主要由BeanFactory负责,而ApplicationContext则负责程序完整上下文管理,从继承关系也可以看出来ApplicationContext是BeanFactory的超集,ApplicationContext是BeanFactory功能的拓展。
public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory, MessageSource, ApplicationEventPublisher, ResourcePatternResolver {
@Nullable
String getId();
String getApplicationName();
String getDisplayName();
long getStartupDate();
@Nullable
ApplicationContext getParent();
AutowireCapableBeanFactory getAutowireCapableBeanFactory() throws IllegalStateException;
}
BeanFactory
官网介绍:https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-beanfactory
官网介绍
总结:
- BeanFactory是IoC的基础,DefaultListableBeanFactory是关键的实现(看DefaultListableBeanFactory就行了)
- BeanFactory与其他组件交互主要通过 BeanFactoryAware, InitializingBean, DisposableBean这些类
- 底层BeanFactory不会感知配置的方式(通过xml还是注解来实现配置),配置的感知由拓展类(XmlBeanDefinitionReader 、AutowiredAnnotationBeanPostProcessor)实现。
DefaultListableBeanFactory源码
从DefaultListableBeanFactory开始,整个继承关系如下:
各个类、接口功能大概描述一下:
AliasRegistry:别名注册接口,定义别名增删改查动作
SimpleAliasRegistry:管理一个aliasMap,注册别名
SingletonBeanRegistry:定义单例的注册获取相关动作
DefaultSingletonBeanRegistry:SingletonBeanRegistry的最简单实现,实现了单例bean的注册,著名的三层缓存解决循环依赖在源码中也有体现。
@Nullable
protected Object getSingleton(String beanName, boolean allowEarlyReference) {
Object singletonObject = this.singletonObjects.get(beanName);
if (singletonObject == null && this.isSingletonCurrentlyInCreation(beanName)) {
singletonObject = this.earlySingletonObjects.get(beanName);
if (singletonObject == null && allowEarlyReference) {
synchronized(this.singletonObjects) {
singletonObject = this.singletonObjects.get(beanName);
if (singletonObject == null) {
singletonObject = this.earlySingletonObjects.get(beanName);
if (singletonObject == null) {
ObjectFactory<?> singletonFactory = (ObjectFactory)this.singletonFactories.get(beanName);
if (singletonFactory != null) {
singletonObject = singletonFactory.getObject();
this.earlySingletonObjects.put(beanName, singletonObject);
this.singletonFactories.remove(beanName);
}
}
}
}
}
}
return singletonObject;
}
BeanFactory:BeanFactory的基本定义,特殊前缀 FACTORY_BEAN_PREFIX = “&”;
FactoryBeanRegistrySupport:继承DefaultSingletonBeanRegistry,实际上也是一个单例的注册器,只不过是针对FactoryBean特殊处理的,维护一个factoryBeanObjectCache的Map
ConfigurableBeanFactory:提供了配置化Bean的实现,在HierarchicalBeanFactory, SingletonBeanRegistry基础上,增加了SCOPE类型(singleton\prototype),增加了Bean的额外的配置信息
AutowireCapableBeanFactory:提供了自动装配Bean的实现,提供bean创建(带有构造函数解析)、属性填充、连接(包括自动装配)和初始化。处理运行时bean引用、解析托管集合、调用初始化方法等。支持自动装配构造函数、按名称的属性和按类型的属性。
ListableBeanFactory:提供了一系列枚举Bean的方法,比如根据Type把相关的Bean列出来、根据Annotation把相关Bean列出来等。
ConfigurableListableBeanFactory:整合ConfigurableBeanFactory、AutowireCapableBeanFactory、ListableBeanFactory。
AbstractBeanFactory:支持管理FactoryBean与通过配置的方式注册的Bean的抽象类。
AbstractAutowireCapableBeanFactory:继承了AbstractBeanFactory与实现了AutowireCapableBeanFactory接口,支持管理通过autowire自动装配注册的bean与配置方式注册的Bean。
DefaultListableBeanFactory:spring中最基础的BeanFactory实现类,官方API描述:Spring’s default implementation of the ConfigurableListableBeanFactory and BeanDefinitionRegistry interfaces: a full-fledged bean factory based on bean definition metadata, extensible through post-processors.
关键代码
resolveBean方法:根据Type获取对应的NameBean实例
private <T> T resolveBean(ResolvableType requiredType, @Nullable Object[] args, boolean nonUniqueAsNull) {
NamedBeanHolder<T> namedBean = this.resolveNamedBean(requiredType, args, nonUniqueAsNull);//先本Factory处理
if (namedBean != null) {
return namedBean.getBeanInstance()