在基于ClassPathXmlApplicationContext创建BeanFactory时,我们从代码里看到,创建的BeanFactory的类型是DefaultListableBeanFactory。
下面我们来分析下DefaultListableBeanFactory的继承结构,以及基于这个结构下,每个父类接口的用途。
具体UML类图实现如下:
下面开始从顶层实现类开始,依次向下逐层分析:
DefaultListableBeanFactory实现
实现接口向上可以追述至BeanFacotry,向下还有XmlBeanFactory实现,但从整个继承结构来看,从DefaultListableBeanFactory开始可以作为独立的IOC容器。
分析源码,在DefaultListableBeanFactory中定义了以下属性
public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory
implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {
/** 存储映射serializedId->DefaultListableBeanFactory的弱引用实例*/
private static final Map<String, Reference<DefaultListableBeanFactory>> serializableFactories =
new ConcurrentHashMap<String, Reference<DefaultListableBeanFactory>>(8);
/** 当前工厂的可选序列化id */
private String serializationId;
/** 是否允许同名的不同bean definition再次进行注册
* 在注册BeanDefinition发现存在同名BeanDefinition时,会检查当前变量,如果为false会抛出BeanDefinitionStoreException */
private boolean allowBeanDefinitionOverriding = true;
/** 是否允许eager类(相对于lazy)的加载,甚至延迟初始化的bean的加载,
* 主要用于在调用doGetBeanNamesForType辅助寻找符合type要求的beanName */
private boolean allowEagerClassLoading = true;
/**是一个策略接口,用来决定一个特定的bean definition 是否满足做一个特定依赖的自动绑定的候选项
* 里面定义了isAutowireCandidate方法用来判断一个Bean是否参与自动装配候选以及getSuggestedValue方法找出最佳候选Bean*/
private AutowireCandidateResolver autowireCandidateResolver = new SimpleAutowireCandidateResolver();
/** 定义了依赖类型和其对应的依赖注入对象键值对集合。 */
private final Map<Class<?>, Object> resolvableDependencies = new HashMap<Class<?>, Object>(16);
/** 定义了BeanName->BeanDefinition的映射关系 */
private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<String, BeanDefinition>(64);
/** 定义了依赖类型->BeanNames的映射关系,包括单例和原型Bean
* 具体存储原理是先根据BeanName读取beanDefinitionNames对象或frozenBeanDefinitionNames对象
* 再调用getMergedLocalBeanDefinition(beanName)方法拿到具体的BeanDefinition,比对BeanClass,满足要求的都保存到List统一返回*/
private final Map<Class<?>, String[]> allBeanNamesByType = new ConcurrentHashMap<Class<?>, String[]>(64);
/** 类似于allBeanNamesByType,不过只包含单例Bean */
private final Map<Class<?>, String[]> singletonBeanNamesByType = new ConcurrentHashMap<Class<?>, String[]>(64);
/** 根据注册顺序,存储所有的beanDefinitionName,即beanName */
private final List<String> beanDefinitionNames = new ArrayList<String>(64);
/** 配置是否冻结 在初始化完BeanFactory,开始初始化所有单例非懒加载Bean时调用finishBeanFactoryInitialization方法进行冻结*/
private boolean configurationFrozen = false;
/** 在设置上一布尔变量同时缓存当前时刻的所有beanDefinitionNames到当前属性 */
private String[] frozenBeanDefinitionNames;
}
在DefaultListableBeanFactory内部,实现了ListableBeanFactory、ConfigurableListableBeanFactory、BeanDefinitionRegistry的相关接口,同时还实现了解析依赖,查到最佳的依赖注入BeanName等。
具体实现的方法可参照下图:
ConfigurableListableBeanFactory
ConfigurableListableBeanFactory定义bean definition的解析,修改等方法功能,还定义了初始化非懒加载单例Bean的核心方法preInstantiateSingletons.
具体接口定义如下:
public interface ConfigurableListableBeanFactory
extends ListableBeanFactory, AutowireCapableBeanFactory, ConfigurableBeanFactory {
/**
* 忽略指定类型的自动装配
* @param type 要忽略的依赖类型
*/
void ignoreDependencyType(Class<?> type);
/**
* 在自动装配时忽略该接口实现类中和setter方法入参相同的类型
* 在进行依赖注入时,会获取待注入属性的set方法,如果set方法的入参实现了本接口,会忽略该属性的依赖注入
* 具体参考https://www.jianshu.com/p/3c7e0608ff1f
* @param ifc 要进行据略的接口
*/
void ignoreDependencyInterface(Class<?> ifc);
/**
* 建议一个依赖类型->自动装配Bean的映射关系
* @param dependencyType 依赖类型
* @param autowiredValue 对应的装配实例,也可以是ObjectFactory的实现,会调用其中的getObject方法完成拦截在.
*/
void registerResolvableDependency(Class<?<