目录

类继承图

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相关推荐

  1. Spring AbstractAutowireCapableBeanFactory

    目录 属性 构造函数 createBean populateBean initializeBean Spring BeanFactory Spring AbstractBeanFactory Spri ...

  2. Spring AbstractBeanFactory

    目录 AbstractBeanFactory的作用 源码解析 属性 获取bean实例 Spring BeanFactory Spring AbstractBeanFactory Spring Abst ...

  3. 为了更好的代码,我写了一个工具:Coca

    好的代码是可以重构出来的. 如我在先前的文章所说,我最近的工作主要是在做架构重构.代码重构.所以,一如既往地,我又写了个工具来帮助我完成相关的工作.这样一来,下次我可以更快速地完成相关的工作. 在这之 ...

  4. spring beans源码解读之 ioc容器之始祖--DefaultListableBeanFactory

    spring Ioc容器的实现,从根源上是beanfactory,但真正可以作为一个可以独立使用的ioc容器还是DefaultListableBeanFactory,因此可以这么说, DefaultL ...

  5. spring源码核心:DefaultListableBeanFactory

    2019独角兽企业重金招聘Python工程师标准>>> 核心创建方式 Class<?> ob = Class.forName("com.fxl.spring.t ...

  6. Spring源码分析(十)依赖注入源码解析3:DefaultListableBeanFactory#doResolveDependency 真正开始解析依赖项

    4.2 真正开始解析依赖项(最核心方法) org.springframework.beans.factory.support.DefaultListableBeanFactory#doResolveD ...

  7. Spring中org.springframework.beans.factory.support.DefaultListableBeanFactory.clinit解决方法.

    [原创文章,转载请注明出处] 刚学Spring,配置上就花了不少时间. 首先给Eclipse EE 装了一个Spring IDE 然后下载了Spring framework 3.0.6 http:// ...

  8. 【spring源码分析】IOC容器初始化(六)

    前言:经过前几篇文章的讲解,我们已经得到了BeanDefinition,接下来将分析Bean的加载. 获取Bean的入口:AbstractApplicationContext#getBean 1 pu ...

  9. spring 单例 获取多例的位_Spring 获取单例流程(一)

    读完这篇文章你将会收获到 在 getBean 方法中, Spring 处理别名以及 factoryBean 的 name Spring 如何从多级缓存中根据 beanName 获取 bean Spri ...

最新文章

  1. 【深度学习】如何从结构出发更好的改进一个神经网络(二)
  2. 汉诺塔问题 hdu 2064 hdu1997
  3. 解决pandas读取parquet报错ImportError:Unable to find a usable engine;tried using: ‘pyarrow‘, ‘fastparquet‘
  4. graphviz python_工具推荐|我是如何使用Python脚本分析CPU使用情况的?
  5. python json传参数可以传对象吗_廖雪峰的python系列教程(52)——IO编程之序列化...
  6. 异常 Failed to instantiate [java.util.List]: Specified class is an interface
  7. canvas beginPath()的初步理解
  8. Charades数据集
  9. 信息学奥赛 python 教程_python抓取信息学奥赛一本通OJ题库
  10. 用JavaScript实现简单的乘法计算
  11. 一级域名怎么申请二级域名?
  12. GPA计算器雏形--
  13. C#WinForm程序 窗口不在任务栏显示的处理方法
  14. Gluster的配置及离线安装
  15. 2019下半年的教师资格考试~学霸大佬们总结的记忆口诀涨分必备
  16. 2020年度“广东省守合同重信用企业”
  17. 前端面试日记(4)- 学而思(笔试+一面+二面)
  18. audition cc变声插件_Adobe Audition CC怎么安装插件?
  19. 使用STM32 和 TF卡、VS1003制作MP3
  20. 使用csc编译c#程序

热门文章

  1. Java将中文姓名转换为拼音
  2. 《深入浅出数据分析》为读者送上了章回小说的精彩
  3. 【struts2】struts2拦截器
  4. Centos6搭建SkyWalking 做分布式跟踪
  5. Java Bean Validation 最佳实践
  6. Hangfire 任务调度
  7. 词法、语法与语义相关知识
  8. 2016年4月11日作业(法律法规、标准规范、职业道德)
  9. 使用devenv/MSBuild在命令行编译单个project
  10. JAVA中的Hashset类