Spring DefaultListableBeanFactory
目录
类继承图
Registry
AliasRegistry
SimpleAliasRegistry
SingletonBeanRegistry
DefaultSingletonBeanRegistry
属性
FactoryBeanRegistrySupport
源码解析
属性
BeanFactory接口方法
ConfigurableListableBeanFactory接口方法
BeanDefinitionRegistry接口方法
Spring BeanFactory
Spring AbstractBeanFactory
Spring AbstractAutowireCapableBeanFactory
Spring DefaultListableBeanFactory
DefaultListableBeanFactory,继承了AbstractAutowireCapableBeanFactory及实现了ConfigurableListableBeanFactory、BeanDefinitionRegistry接口。
spring Ioc容器的实现,从根源上是beanfactory,但真正可以作为一个可以独立使用的ioc容器还是DefaultListableBeanFactory,因此可以这么说,DefaultListableBeanFactory 是整个spring ioc的始祖。
类继承图
Registry
提供对对象的注册管理。
AliasRegistry
AliasRegistry接口是对别名增删改查等管理。
public interface AliasRegistry {void registerAlias(String name, String alias);void removeAlias(String alias);boolean isAlias(String name);String[] getAliases(String name);
}
SimpleAliasRegistry
实现了AliasRegistry接口,用ConcurrentHashMap存储别名的对应关系,别名作为key,name作为value。用于快速访问到别名对应的beanName。
private final Map<String, String> aliasMap = new ConcurrentHashMap<>(16);
SingletonBeanRegistry
用于单例bean的注册管理等。
public interface SingletonBeanRegistry {void registerSingleton(String beanName, Object singletonObject);@NullableObject getSingleton(String beanName);boolean containsSingleton(String beanName);String[] getSingletonNames();int getSingletonCount();Object getSingletonMutex();
}
DefaultSingletonBeanRegistry
DefaultSingletonBeanRegistry类继承了SimpleAliasRegistry以及实现了SingletonBeanRegistry的接口。处理Bean的注册,销毁,以及依赖关系的注册和销毁。
属性
// 单例对象的缓存:key:beanname,value:bean实例
// 加入了单例对象的缓存(对象已初始化完成),那singletonFactories和earlySingletonObjects就不再需要了。
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);
// 单例工厂的缓存:key:beanname , value:ObjectFactory
private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);
// 早期单例对象的缓存:key:beanname,value:bean实例,bean实例未初始化完成。
private final Map<String, Object> earlySingletonObjects = new HashMap<>(16);
// 一组已注册的单例,包含按注册顺序排列的beanname
private final Set<String> registeredSingletons = new LinkedHashSet<>(256);
// 正在创建的单例的beanName的集合
private final Set<String> singletonsCurrentlyInCreation = Collections.newSetFromMap(new ConcurrentHashMap<>(16));
// 当前不检查的bean的集合
private final Set<String> inCreationCheckExclusions = Collections.newSetFromMap(new ConcurrentHashMap<>(16));
// 异常集合
private Set<Exception> suppressedExceptions;
// 当前是否在销毁bean中
private boolean singletonsCurrentlyInDestruction = false;
// 一次性bean实例
private final Map<String, Object> disposableBeans = new LinkedHashMap<>();
// 内部bean和外部bean之间关系
private final Map<String, Set<String>> containedBeanMap = new ConcurrentHashMap<>(16);
// 指定bean与依赖指定bean的集合,比如bcd依赖a,那么就是key为a,bcd为value
private final Map<String, Set<String>> dependentBeanMap = new ConcurrentHashMap<>(64);
// 指定bean与指定bean依赖的集合,比如a依赖bcd,那么就是key为a,bcd为value
private final Map<String, Set<String>> dependenciesForBeanMap = new ConcurrentHashMap<>(64);
FactoryBeanRegistrySupport
FactoryBeanRegistrySupport抽象类继承了DefaultSingletonBeanRegistry类,增加了对FactoryBean的处理。
private final Map<String, Object> factoryBeanObjectCache = new ConcurrentHashMap<>(16);
源码解析
属性
// 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;
BeanFactory接口方法
@Override// 根据class类型获取beanpublic <T> T getBean(Class<T> requiredType) throws BeansException {return getBean(requiredType, (Object[]) null);}@SuppressWarnings("unchecked")@Overridepublic <T> T getBean(Class<T> requiredType, @Nullable Object... args) throws BeansException {Assert.notNull(requiredType, "Required type must not be null");Object resolved = resolveBean(ResolvableType.forRawClass(requiredType), args, false);if (resolved == null) {throw new NoSuchBeanDefinitionException(requiredType);}return (T) resolved;}@Nullableprivate <T> T resolveBean(ResolvableType requiredType, @Nullable Object[] args, boolean nonUniqueAsNull) {NamedBeanHolder<T> namedBean = resolveNamedBean(requiredType, args, nonUniqueAsNull);if (namedBean != null) {return namedBean.getBeanInstance();}BeanFactory parent = getParentBeanFactory();if (parent instanceof DefaultListableBeanFactory) {return ((DefaultListableBeanFactory) parent).resolveBean(requiredType, args, nonUniqueAsNull);}else if (parent != null) {//查找祖先BeanFactory的 ObjectProviderObjectProvider<T> parentProvider = parent.getBeanProvider(requiredType);if (args != null) {return parentProvider.getObject(args);}else {return (nonUniqueAsNull ? parentProvider.getIfUnique() : parentProvider.getIfAvailable());}}return null;}@Nullable//通过类型解析beanprivate <T> NamedBeanHolder<T> resolveNamedBean(ResolvableType requiredType, @Nullable Object[] args, boolean nonUniqueAsNull) throws BeansException {Assert.notNull(requiredType, "Required type must not be null");//通过类型获取所有bean NamesString[] candidateNames = getBeanNamesForType(requiredType);if (candidateNames.length > 1) {List<String> autowireCandidates = new ArrayList<>(candidateNames.length);for (String beanName : candidateNames) {if (!containsBeanDefinition(beanName) || getBeanDefinition(beanName).isAutowireCandidate()) {autowireCandidates.add(beanName);}}if (!autowireCandidates.isEmpty()) {candidateNames = StringUtils.toStringArray(autowireCandidates);}}//仅有一个直接返回if (candidateNames.length == 1) {String beanName = candidateNames[0];return new NamedBeanHolder<>(beanName, (T) getBean(beanName, requiredType.toClass(), args));}else if (candidateNames.length > 1) {Map<String, Object> candidates = new LinkedHashMap<>(candidateNames.length);for (String beanName : candidateNames) {//单例并且没有构造参数,返回单例。if (containsSingleton(beanName) && args == null) {Object beanInstance = getBean(beanName);candidates.put(beanName, (beanInstance instanceof NullBean ? null : beanInstance));}else {candidates.put(beanName, getType(beanName));}}//选择最合适的候选对象。String candidateName = determinePrimaryCandidate(candidates, requiredType.toClass());//如果没有最合适的,选择高优先级的。if (candidateName == null) {candidateName = determineHighestPriorityCandidate(candidates, requiredType.toClass());}//找到了候选者,if (candidateName != null) {Object beanInstance = candidates.get(candidateName);if (beanInstance == null || beanInstance instanceof Class) {//实例不存在,则构造实例。beanInstance = getBean(candidateName, requiredType.toClass(), args);}return new NamedBeanHolder<>(candidateName, (T) beanInstance);}//多个候选者,判断是否抛出异常。if (!nonUniqueAsNull) {throw new NoUniqueBeanDefinitionException(requiredType, candidates.keySet());}}return null;}@Overridepublic <T> NamedBeanHolder<T> resolveNamedBean(Class<T> requiredType) throws BeansException {Assert.notNull(requiredType, "Required type must not be null");NamedBeanHolder<T> namedBean = resolveNamedBean(ResolvableType.forRawClass(requiredType), null, false);if (namedBean != null) {return namedBean;}BeanFactory parent = getParentBeanFactory();if (parent instanceof AutowireCapableBeanFactory) {return ((AutowireCapableBeanFactory) parent).resolveNamedBean(requiredType);}throw new NoSuchBeanDefinitionException(requiredType);}
ConfigurableListableBeanFactory接口方法
略
BeanDefinitionRegistry接口方法
略
Spring DefaultListableBeanFactory相关推荐
- Spring AbstractAutowireCapableBeanFactory
目录 属性 构造函数 createBean populateBean initializeBean Spring BeanFactory Spring AbstractBeanFactory Spri ...
- Spring AbstractBeanFactory
目录 AbstractBeanFactory的作用 源码解析 属性 获取bean实例 Spring BeanFactory Spring AbstractBeanFactory Spring Abst ...
- 为了更好的代码,我写了一个工具:Coca
好的代码是可以重构出来的. 如我在先前的文章所说,我最近的工作主要是在做架构重构.代码重构.所以,一如既往地,我又写了个工具来帮助我完成相关的工作.这样一来,下次我可以更快速地完成相关的工作. 在这之 ...
- spring beans源码解读之 ioc容器之始祖--DefaultListableBeanFactory
spring Ioc容器的实现,从根源上是beanfactory,但真正可以作为一个可以独立使用的ioc容器还是DefaultListableBeanFactory,因此可以这么说, DefaultL ...
- spring源码核心:DefaultListableBeanFactory
2019独角兽企业重金招聘Python工程师标准>>> 核心创建方式 Class<?> ob = Class.forName("com.fxl.spring.t ...
- Spring源码分析(十)依赖注入源码解析3:DefaultListableBeanFactory#doResolveDependency 真正开始解析依赖项
4.2 真正开始解析依赖项(最核心方法) org.springframework.beans.factory.support.DefaultListableBeanFactory#doResolveD ...
- Spring中org.springframework.beans.factory.support.DefaultListableBeanFactory.clinit解决方法.
[原创文章,转载请注明出处] 刚学Spring,配置上就花了不少时间. 首先给Eclipse EE 装了一个Spring IDE 然后下载了Spring framework 3.0.6 http:// ...
- 【spring源码分析】IOC容器初始化(六)
前言:经过前几篇文章的讲解,我们已经得到了BeanDefinition,接下来将分析Bean的加载. 获取Bean的入口:AbstractApplicationContext#getBean 1 pu ...
- spring 单例 获取多例的位_Spring 获取单例流程(一)
读完这篇文章你将会收获到 在 getBean 方法中, Spring 处理别名以及 factoryBean 的 name Spring 如何从多级缓存中根据 beanName 获取 bean Spri ...
最新文章
- 【深度学习】如何从结构出发更好的改进一个神经网络(二)
- 汉诺塔问题 hdu 2064 hdu1997
- 解决pandas读取parquet报错ImportError:Unable to find a usable engine;tried using: ‘pyarrow‘, ‘fastparquet‘
- graphviz python_工具推荐|我是如何使用Python脚本分析CPU使用情况的?
- python json传参数可以传对象吗_廖雪峰的python系列教程(52)——IO编程之序列化...
- 异常 Failed to instantiate [java.util.List]: Specified class is an interface
- canvas beginPath()的初步理解
- Charades数据集
- 信息学奥赛 python 教程_python抓取信息学奥赛一本通OJ题库
- 用JavaScript实现简单的乘法计算
- 一级域名怎么申请二级域名?
- GPA计算器雏形--
- C#WinForm程序 窗口不在任务栏显示的处理方法
- Gluster的配置及离线安装
- 2019下半年的教师资格考试~学霸大佬们总结的记忆口诀涨分必备
- 2020年度“广东省守合同重信用企业”
- 前端面试日记(4)- 学而思(笔试+一面+二面)
- audition cc变声插件_Adobe Audition CC怎么安装插件?
- 使用STM32 和 TF卡、VS1003制作MP3
- 使用csc编译c#程序