月泉的博客

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

月泉 JavaSpring

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

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

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

逐一来分析

AliasRegistry

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

SimpleAliasRegistry

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

SingletonBeanRegistry

该接口主要定义了单例Bean的注册及获取,接口如图,这接口很好理解,笔者感觉不需要解释,如果实在看不懂私聊我吧233333 SingletonBeanRegistry 接口方法定义 接着说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也是非常有必要的,而且它和现在推荐的做法,在使用还是有点区别的,先不聊了,下篇见。

月泉
伪文艺中二青年,热爱技术,热爱生活。