@TOC 在讲容器以前,再明确一下知识点。java
BeanDefinition物料须要有地方存储,Bean成品须要有地方存。今天咱们讲讲仓库。算法
BeanFactory接口: 容器顶级接口,提供了容器最基本的能力,包括获取bean,是否包含bean,是否单例,获取bean类型,Bean的别名等方法。spring
ListableBeanFactory接口: BeanFactory的子接口;具备批量获取Bean的能力缓存
HierarchicalBeanFactory接口:具备访问父容器的能力。有层次的BeanFactory。mvc
AutowireCapableBeanFactory接口:继承BeanFactory,扩展了自动装配能力。这个接口更多的做用是用于于与其余框架集成,把不在spring容器中的Bean加入到Spring容器生命周期管理中来。此接口不多用框架
ConfigurableBeanFactory:定义了BeanFactory的配置。继承HierarchicalBeanFactory和SingletonBeanRegistry接口。实现了此接口的容器,具备层次,单例BeanDefinition注册功能。编辑器
ConfigurableListableBeanFactory: 大融合接口,除了具备上述接口的能外,还具备:类加载器,类型转化,属性编辑器,BeanPostProcessor,做用域,bean定义,处理bean依赖关系, bean销毁等功能。spa
SingletonBeanRegistry接口: 具备Bean的操做能力.注册,查询,获取Bean数量等能力. 注意此处的Bean是实例.区别于BeanDefinition.设计
SimpleAliasRegistry:Bean的别名操做类,实现了AliasRegistry.具备存储Bean别名,注册Bean别名,获取Bean别名的功能.aliasMap属性存储Bean别名3d
DefaultSingletonBeanRegistry:除了继承了SimpleAliasRegistry的功能外. 最重要的是实现了SingletonBeanRegistry接口.具备存储Bean实例,注册Bean,获取Bean的能力.咱们定义的被Spring管理的Class类的实例对象,以及实例的之间的相互依赖关系都是存储在此类中.默认经常使用的容器DefaultListableBeanFactory的Bean的相关能力.就是经过间接继承此类来实现的.
/** Disposable bean instances: bean name --> disposable instance */
private final Map<String, Object> disposableBeans = new LinkedHashMap<String, Object>();
/** Map between containing bean names: bean name --> Set of bean names that the bean contains */
private final Map<String, Set<String>> containedBeanMap = new ConcurrentHashMap<String, Set<String>>(16);
/** Map between dependent bean names: bean name --> Set of dependent bean names */
private final Map<String, Set<String>> dependentBeanMap = new ConcurrentHashMap<String, Set<String>>(64);
/** Map between depending bean names: bean name --> Set of bean names for the bean's dependencies */
private final Map<String, Set<String>> dependenciesForBeanMap = new ConcurrentHashMap<String, Set<String>>(64)
复制代码
小结:
经过上面的对各个接口,类的认识.咱们再来看看三者的关系.
咱们向BeanFactory容器中注入一个BeanDefinition。BeanFactory帮咱们存储起来.当咱们想要获得一个Bean时.BeanFactory 帮咱们把BeanDefinition建立Bean.并缓存起来.这个建立过程是可参与的.
设计原则之开闭原则说的特别好:说一个软件实体应该经过扩展来实现变化. 不少优秀的框架都有相似的扩展点设计,列如:
BeanFactory中从BeanDefinition到Bean并非一会儿就完成的.这有一个过程.spring正是在这个过程当中留下扩展点.来实现BeanDefinition到Bean的过程当中的各类自定义变化.
从上面咱们得知:AbstractAutowireCapableBeanFactory中有个doCreateBean()正是BeanDefinition到Bean的建立方法.接下来咱们看看这个方法.有哪些扩展点:
BeanFactory是物料与成品仓库,并配生产线,把BeanDefinition生产成Bean 。BeanFactory留下不少扩展点, 方便开发人员能够参与BeanDefinition到Bean的建立过程.
欢迎你们关注个人公众号【源码行动】,最新我的理解及时奉送。