BeanFactory体系结构探析
提到Spring , 总是让人第一时间想起IOC容器 , 而IOC容器地顶层核心接口就是我们地BeanFactory , 如果能够理解BeanFactory的体系结构想必能让我们对Spring整体脉络有更加清晰的认知 , 所以 , 本文的探究方向主要为以下几点:
- BeanFactory的体系结构是怎样的?
- Bean的元信息从何而来?
- BeanFactory生产Bean的过程是怎样的?
文章插图
其中ApplicationContext这一块已在上篇文章有详细说明 , 而DefaultListableBeanFactory这个底层实现类便理所当然地成为了我们此次探究的出发点 , 为了让我们有个更好的观感 , 以下是纯粹的BeanFactoryUML图:
文章插图
我们可以看到DefaultListableBeanFactory实现的接口有:
- SingletonBeanRegistry: 定义了对单例缓存池相关的操作 , 如将bean注册到单例缓存池中
- ConfigurableBeanFactory: 可配置的BeanFactory , 定义了各种各样的配置能力 , 如bean的作用域 , bean的classLoader,添加bean的后置处理器 , 设置bean的创建状态 , 销毁bean等等
- AutowireCapableBeanFactory: 能进行自动装配的BeanFactory,这可能是我们最为熟悉的BeanFactory , 定义了自动装配的类型(byName/byType) , createBean, autowireBean, 自动装配属性, populateBean, initializeBean, 对于与bean生命周期相关的方法都将在这里体现
- ListableBeanFactory: 对BeanFactory的增强 , 定义了一系列根据beanType获取bean或者beanName的方法
- ConfigurableListableBeanFactory: 对ConfigurableBeanFactory的增强 , 定义了忽略bean的类型、缓存bean定义、预实例化单例bean等方法
- BeanDefinitionRegistry: bean定义注册器 , 定义了与bean定义相关的方法
- DefaultSingletonBeanRegistry: 单例bean注册器 , 定义了三级缓存 , 其实就是三个Map属性
- FactoryBeanRegistrySupport: 提供对FactoryBean的支持
- AbstractBeanFactory: 实现了一系列操作IOC容器的功能 , 但最终的createBean依旧交由子类AbstractAutowireCapableBeanFactory完成
- AbstractAutowireCapableBeanFactory: 实现了创建bean的功能 , 所有与创建bean的相关的功能都在这里
- DefaultListableBeanFactory: 在以上父类的功能基础上实现了ConfigurableBeanFactory和BeanDefinitionRegistry接口 , 定义了一些存放Bean定义相关信息的Map
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();RootBeanDefinition beanDefinition = new RootBeanDefinition(Wheel.class);beanFactory.registerBeanDefinition("wheel",beanDefinition);beanFactory.getBean("wheel", Wheel.class);1234
Bean的元信息从何而来?我们现在已经知道DefaultListableBeanFactory的大致功能了 , 我们发现当我们想要创建一个Bean的时候 , 总是离不开一个名词:Bean定义 , 那么这个Bean定义究竟是什么呢?BeanDefinition其实是一个接口 , 并不是一个具体的类 , 我们也可以看一下它的UML图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
文章插图
可以发现这里使用了模板方法的设计模式扩展了许多的子类 , 其中我们最常用的为RootBeanDefinition , 它主要包含的属性如下:
文章插图
我们向容器中注册的Bean定义的信息大概就是如此 , 当BeanFactory生产Bean时 , 便可以通过beanClass清楚的知道Bean的类是什么 , 作用域是怎样 , 是否懒加载 , init方法是什么等等等等
咦 , 如果一个最简单的bean , 好像可以直接通过反射就搞定了耶~
具体结构已经清楚了 , 那我们来看一下注册过程吧
先从Demo看起
public static void main(String[] args) {//创建一个DefaultListableBeanFactory实例DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();//创建一个BeanDefinitionRootBeanDefinition beanDefinition = new RootBeanDefinition(Wheel.class);//将BeanDefinition注册到容器中beanFactory.registerBeanDefinition("wheel",beanDefinition);}public static class Wheel {}1234567891011
- 智能建筑弱电系统的应用与发展探析
- 设计|探析“网红”手机背后的秘密,为了受欢迎vivo S7e只做了这两点
- 彭波在《现代传播》撰文:我国消弭数字鸿沟的新机遇与新路径探析
- Gartner|Gartner发布,探析2021年九大技术趋势在保险行业应用
- Gartner发布,探析2021年九大技术趋势在保险行业应用
- 理解透彻!BeanFactory与FactoryBean分析