DeafultListableBeanFactory 是可以独立使用的BeanFactory接口实现类,默认继承了AbstractAutowireCapableBeanFactory
,实现了ListableBeanFactory和BeanDefinitionRegistry接口
即可以作为单独的BeanFacory容器,也可以作为自定义BeanFactory的父类。
1、DefaultListableBeanFactory的作用
Spring容器加载时,常见的应用是访问Bean前,需要注册所有的BeanDefinition。使用预先创建的Bean定义元
数据对象,从本地的BeanDefinition表中查询BeanDefinition因而不会花费太多成本。
2、DefaultListableBeanFactory实现的接口作用
AliasRegistry:制定别名的管理规则,定义了对alias的简单增删改等操作。
SimpleAlliasRegistry:用map作为alias的缓存,并对接口AliasRegistry进行实现。
SingletonBeanRegistry:定义对单例的注册以及获取。
DefaultSingletonBeanRegistry:对接口SingletonBeanRegistry各函数的实现。
FactoryBeanRegistrySupport:在DefaultSingletonBeanRegistry基础上增加了对FactoryBean的特殊处理功能。
DefaultListableBeanFactory 综合了接口的所有功能,主要负责了Bean注册后的处理逻辑。
3、属性字段
// Java依赖注入标准 JSR-330 支持。
private static Class<?> javaxInjectProviderClass;
// DefaultListableBeanFactory引用的缓存
private static final Map<String, Reference<DefaultListableBeanFactory>> serializableFactories = new ConcurrentHashMap<>(8);
// 序列号id
private String serializationId;
// 是否允许用相同的名称重新注册不同的定义
private boolean allowBeanDefinitionOverriding = true;
// 是否允许懒加载
private boolean allowEagerClassLoading = true;
// 依赖排序顺序
private Comparator<Object> dependencyComparator;
// 解析器,用于检查bean定义是否为自动装配候选
private AutowireCandidateResolver autowireCandidateResolver = new SimpleAutowireCandidateResolver();
// 依赖类型和自动注入值的映射
private final Map<Class<?>, Object> resolvableDependencies = new ConcurrentHashMap<>(16);
// BeanDefinition和beanName的映射
private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);
// 依赖类型和单例、非单例bean的映射
private final Map<Class<?>, String[]> allBeanNamesByType = new ConcurrentHashMap<>(64);
// 依赖类型和单例bean的映射
private final Map<Class<?>, String[]> singletonBeanNamesByType = new ConcurrentHashMap<>(64);
// bean定义名称列表,按注册顺序排列。
private volatile List<String> beanDefinitionNames = new ArrayList<>(256);
// 手动注册的单例,按注册顺序排列
private volatile Set<String> manualSingletonNames = new LinkedHashSet<>(16);
// 固定配置的缓存的bean定义名数组
private volatile String[] frozenBeanDefinitionNames;
// 是否可以缓存所有bean的bean定义元数据
private volatile boolean configurationFrozen = false;
4、主要方法
copyConfigurationFrom(ConfigurableBeanFactory otherFactory) 复制其他配置信息
getBean() 获取bean
getBeanProvider 获取bean的提供者
resolveBean
如果父类是DefaultListableBeanFactory,调用父类的resolveBean方法
如果父类不是DefaultListableBeanFactory,且不为空,获取父类的bean的提供者,
如果有参数,调用有参构造
无参构造,getIfAvailable:实际存在才返回一个实例,* getIfUnique: 有多个实例时,返回默认的实例(比如primary)
getBeanNamesForTypedStream 通过ResolvableType获取bean名称
containsBeanDefinition 检查此Bean工厂是否包含指定名称的Bean定义信息,不考虑工厂可能参与的任何层级
getBeanDefinitionCount 获取Bean定义的个数
getBeanNamesForType 根据Bean定义或FactoryBean中getObjectType的值判断,返回给定类型匹配的Bean名称
requiresEagerInitForType 是否马上返回bean以确定类型
getBeansOfType 获取bean名称和实例的映射
getBeanNamesForAnnotation 根据注解获取bean的名称
findAnnotationOnBean 根据beanName获取注解
registerResolvableDependency 注册依赖类型,自动注入值
isAutowireCandidate 指定的bean是否是自动注入的候选
getBeanDefinition 从beanDefinitionMap找bean的定义
getBeanNamesIterator 获取bean的迭代名称,包括自定的和手动注册的
freezeConfiguration 冻结当前的bean的信息
isBeanEligibleForMetadataCaching 是否已经冻结了或者是否已创建
preInstantiateSingletons 确保实例化了所有非lazy-init单例
BeanFactory源码体系解析--DefaultListableBeanFactory四
于 2022-02-12 14:31:41 首次发布