【Spring源码阅读】 DefaultListableBeanFactory继承结构讲解分析

在基于ClassPathXmlApplicationContext创建BeanFactory时,我们从代码里看到,创建的BeanFactory的类型是DefaultListableBeanFactory。
下面我们来分析下DefaultListableBeanFactory的继承结构,以及基于这个结构下,每个父类接口的用途。
具体UML类图实现如下:
image
下面开始从顶层实现类开始,依次向下逐层分析:

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等。
具体实现的方法可参照下图:
image

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<?<
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值