Spring源码系列- Spring Beans - 核心类的基本介绍

读过上一篇文章的读者应该都能对Spring的体系结构有一个大致的了解,在结尾处,我也说过会从spring-beans包开始分析,在重复一下beans它主要与配置文件的解析、管理、创建bean及IOC/DI相关。

beanscontext就是Spring实现IOC容器的基础,当然在本章只会提及beans不会提及context当然在以后的文章会提及到context

beans包中最核心的的一个类之一就是DefaultListableBeanFactory,当然这一篇文章会围绕着这个类来进行分解
首先来了解下DefaultListBeanFactory这个类的关系结构
该类继承了AbstractAutowireCapableBeanFactory并实现了ConfigurableListableBeanFactoryBeanDefinitionRegistry接口Serializable就不用说了吧?233333

逐一来分析

AliasRegistry

该接口主要定义了用于管理别名,提供了别名的注册、删除、获取、以及判断别名的接口。该接口目前定义的接口方法如图
接着是实现了AliasRegistry接口的SimpleAliasRegistry

SimpleAliasRegistry

该类主要是实现了AliasRegistry接口并使用了Map对象来存储别名,个人感觉里面没什么好说的,感兴趣的可以自己去看看该类的源码,如有不懂的可以邮件我yuequan1997@gmail.com或者加我微信yuequan1997都可以。
接下来左走一步先说SingletonBeanRegistry接口,在接着往下说DefaultSingletonBeanRegistry

SingletonBeanRegistry

该接口主要定义了单例Bean的注册及获取,接口如图,这接口很好理解,笔者感觉不需要解释,如果实在看不懂私聊我吧233333
接着说DefaultSingletonBeanRegistry

DefaultSingletonBeanRegistry

该类主要还是实现了DefaultSingletonBeanRegistry,笔者认为该实现的和定义几个方法都很好理解,感觉不用太过于去解释,但是该类定义的几个变量还是稍微值得解释下的

// 缓存所有注册的singleton实例
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);
// 缓存singleton 工厂
private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);
// 目前我在该类中看到的作用是用于缓存singleton工厂获取出来的singleton实例
private final Map<String, Object> earlySingletonObjects = new HashMap<>(16);
// 缓存已注册的singleton实例的beanName
private final Set<String> registeredSingletons = new LinkedHashSet<>(256);
// 缓存正在创建中的singleton实例
private final Set<String> singletonsCurrentlyInCreation =Collections.newSetFromMap(new ConcurrentHashMap<>(16));
// 缓存不需要获取创建中这种状态的singleton实例
private final Set<String> inCreationCheckExclusions =Collections.newSetFromMap(new ConcurrentHashMap<>(16));
// 缓存发生异常时可以用于抛出异常的类集合
private Set<Exception> suppressedExceptions;
// 只需要缓存一次的bean
private final Map<String, Object> disposableBeans = new LinkedHashMap<>();
// 缓存bean包含的bean names
private final Map<String, Set<String>> containedBeanMap = new ConcurrentHashMap<>(16);
// 缓存bean依赖的bean names
private final Map<String, Set<String>> dependentBeanMap = new ConcurrentHashMap<>(64);
// 缓存创建bean时所需要依赖的所有依赖关系
private final Map<String, Set<String>> dependenciesForBeanMap = new ConcurrentHashMap<>(64);

解决bean的依赖问题的属性主要是

  • containedBeanMap
  • dependentBeanMap
  • dependenciesForBeanMap

因为这个类的源码可读性非常的强,想要深入的了解可以自行的去细看该类的源码,这里已经把属性都进行了说明已经更加好阅读实现的逻辑了,笔者也一直希望是授人以鱼不如授人以渔的心态来和大家分享、探讨。
接下来是FactoryBeanRegistrySupport

FactoryBeanRegistrySupport

该类继承了DefaultSingletonBeanRegistry并添加了factoryBean的支持
接下来是AbstractBeanFactory?或者ConfigurableBeanFactory?,NONONO,我看待事物和分析东西都喜欢从最上面开始当然是BeanFactory

BeanFactory

该接口主要提供了bean的各种获取方式和bean的各种属性,该篇不会对这一块进行太详细的说明,只需要有个印象即可,以后的章节会分析到这里的。

HierarchicalBeanFactory

该接口继承至BeanFactory接口在该基础之上新增了获取parentFactorycontainsLocalBean接口方法。

ConfigurableBeanFactory

该接口继承至HierarchicalBeanFactorySingletonBeanFactory,主要是新增了配置BeanFactory的方法
接下来是

AbstractBeanFactory

该类继承了FactoryBeanRegistrySupport并实现了ConfigurableBeanFactory接口综合了2者的功能,写着写着发现有好多内容…… 还是以后单独拉一篇写吧,而且目前几篇的重点不在此,先有印象即可。
接下来是AbstractAutowireCapableBeanFactory,嗯,这就太年轻了,我说过,我喜欢从上面开始当然是先说AutowireCapableBeanFactory

AutowireCapableBeanFactory

该接口继承至BeanFactory,该接口主要定义了创建bean、初始化、注入、使用后的Processors

AbstractAutowireCapableBeanFactory

综合了AbstractBeanFactory的功能并实现了AutowireCapableBeanFactory接口

ListableBeanFactory

该接口继承至BeanFactory,它主要提供了获取bean的基本信息和bean的配置名和是否包含某一个Bean等接口方法

ConfigurableListableBeanFactory

该类继承了

  • ListableBeanFactory
  • AutowireCapableBeanFactory
  • ConfigurableBeanFactory

除了拥有父接口的方法外,还提供了获取BeanDefinition和预加载以及忽略的类型等接口

BeanDefinitionRegistry

该接口继承至AliasRegistry接口,还新添加了对BeanDefinition的注册、删除还有获取还有是否以及在使用中等接口方法

DefaultListableBeanFactory

该类综合了以上所有的功能,它是Spring对注册及加载Bean的默认实现

该篇主要是为下几篇做铺垫,不必过于深入,深入的往后会写到,这一篇仅仅是一个过渡的铺垫,剧透时间:接下来会说最经典以前经常用,在3.1后就以及被废弃了的XmlBeanFactory,问我为什么要说废弃了的这个类?说了先从bean包开始,推荐的做法跟context包息息相关,写到哪里的时候再做详细的赘述,同时去分析XmlBeanFactory也是非常有必要的,而且它和现在推荐的做法,在使用还是有点区别的,先不聊了,下篇见。

最后:

我想,可能还有很多人在今年刚过去的金三银四春招中保持着观望的形势,害怕自己的能力不够,或者是安于现状,觉得目前拿着几千的月薪觉得能够接受,那么你就要注意了,这是非常危险的!

我们身为技术人员,最怕的就是安于现状,一直在原地踏步,那么你可能在30岁就会迎来自己的职业危机,因为你工作这么久提升的只有自己的年龄,技术还是万年不变!

如果你想在未来能够自我突破,圆梦大厂,那或许以上这份Java学习资料,你需要阅读阅读,希望能够对你的职业发展有所帮助。

获取方式: 只需你**点赞+关注**后,进[Java架构资源交流群] ,找管理员获取哦-!

lor=Red size=4>获取方式**: 只需你**点赞+关注**后,进[Java架构资源交流群] ,找管理员获取哦-!

Spring源码系列- Spring Beans - 核心类的基本介绍相关推荐

  1. Ioc容器beanDefinition-Spring 源码系列(1)

    Ioc容器beanDefinition-Spring 源码系列(1) 目录: Ioc容器beanDefinition-Spring 源码(1) Ioc容器依赖注入-Spring 源码(2) Ioc容器 ...

  2. Spring源码系列:依赖注入(二)createBean

    在Spring源码系列:依赖注入(一)(AbstractBeanFactory-getBean)最后说道getBean是依赖注入的起点,bean的创建都是通过createBean来完成具体的创建的.c ...

  3. Spring源码系列(十二)Spring创建Bean的过程(二)

    1.写在前面 上篇博客主要Spring在创建Bean的时候,第一次调用的Bean的后置处理器的过程,同时笔者也打算将整个Spring创建的Bean的过程,通过这个系列,将Bean的创建过程给讲清楚,废 ...

  4. spring源码依赖注入的核心方法populateBean(beanName, mbd, instanceWrapper)分析

    spring源码依赖注入的核心方法populateBean(beanName, mbd, instanceWrapper)分析:通过源码我们发现在分析这个方法之前,此对象已经创建完成实例,内存开辟了空 ...

  5. 【spring源码系列-05】refresh中prepareRefresh方法的执行流程

    Spring源码系列整体栏目 内容 链接地址 [一]spring源码整体概述 https://blog.csdn.net/zhenghuishengq/article/details/13094088 ...

  6. Spring源码系列:BeanDefinition载入(下)

    在Spring源码系列:BeanDefinition载入(上)中已经大概捋了一下解析过程,本篇将记录一下bean的注册过程. bean的注册就是DefaultListableBeanFactory中r ...

  7. 【Spring源码】Spring Transactional事务:传播机制(Propagation) 介绍 和 源码剖析

    [Spring源码]Spring Transactional事务:传播机制(Propagation) 源码剖析 关键词 AMethod调用BMethod,转载BMethod的角度来考虑:站在被调用者的 ...

  8. Spring源码系列-第1章-Spring源码纵览【持续更新中】

    文章目录 必读 第1章-Spring源码纵览 概述 简单的继承关系图 Spring框架整体流程 核心组件接口分析 Resource资源 方法 实现类 ResourceLoader资源加载器 方法 实现 ...

  9. Spring源码系列:BeanFactory的创建

    2019独角兽企业重金招聘Python工程师标准>>> Spring的Ioc容器其实就是一个bean的关系网,依赖于core,bean,context三个组件来构建的.在spring ...

最新文章

  1. 关于cn.jedisoft.framework.annotations 的增删改查
  2. 98.512X4位的芯片,要怎么组成4K的存储空间要用多少个芯片级联?具体用多少引脚?
  3. phrases practice_七年级短语、固定搭配练习题Phrases practice for Grade seven
  4. opengl 球纹理旋转源代码
  5. 谁来代替博客园——寄生博客
  6. php会员可见内容代码,DedeCMS内容隐藏指定字段仅对会员显示对游客不可见的实现方法...
  7. HDUOJ3549 - Flow Problem(网络流+最大流最小割+模板)
  8. 人工智能+眼科疾病辅助诊断(相关信息搜集)
  9. Ubuntu下为Hadoop安装配置Hbase教程
  10. keil5怎么放大字体_keil4调节字体 keil字体放大快捷键
  11. 西刺代理python_手把手教你使用Python爬取西刺代理数据(下篇)
  12. 微信小程序自定义导航栏样式
  13. js判断移动端还是pc端
  14. vtkPolyData获取bounds点坐标
  15. win7计算机u盘不显示盘符,win7系统识别U盘但不显示盘符该如何解决?
  16. 五、Sql Server 基础培训《进度5-数据类型(知识点+实际操作)》
  17. app式成语_app的成语都有什么?
  18. c语言计时纳秒_C代码中以纳秒为单位计算函数时间
  19. python 拆分excel工作表_Python几行代码轻松拆分表格
  20. MXL90614红外线测温传感器

热门文章

  1. 告别LiveServer,vscode微软官方的LivePreview来了
  2. 操盘手到底是个什么职业?
  3. 深入了解服务注册与发现
  4. 中国银联mPOS通用技术安全分析和规范解读
  5. 如何避免面向监狱编程以及程序员如何通过合法途径获利
  6. 光敏二极管为什么反接
  7. 微软认证Programming in C# 70-483 MCP 首日封(首日拿下)
  8. 马斯克打了个响指,推特50%员工被裁....
  9. C语言都能用来干吗、我为什么要学C语言
  10. 中高级Java程序员,你不得不掌握的基本功,挑战20k+