一、Spring 中的Bean工厂
Springframework 整个框架的功能执行都围绕着底层的IOC容器,而容器中实例对象的创建和获取都是由工厂来完成。
Springframework 定义了工厂接口 BeanFactory
,再次基础上定义了具有不同功能的工厂规范,如:可继承的工厂、可配置的工厂。
通过继承,实现、组合一系列操作,组合有各自功能的工厂,以此来实现工厂一个具有多种功能的Bean工厂。
Bean 工厂组合类图,如下:
同时为了应对 Bean 获取的多种场景,springframework bean 工厂提供有多个重载的 getBean
的方法,如下图:
当我们需要获取一个被 Springframework 管理的 Bean 实例对象时,只需要获取对应的 BeanFactory 工厂,调用 getBean
方法即可。
工厂的作用就是用来屏蔽对象的创建, springframework 的工厂构建 Bean对象很复杂,包括配置文件解析,支持 xml形式的配置解析,同样也支持注解式的配置解析,同时还提供有 API 手动注册到工厂。同时还支持懒加载等一系列复杂功能。
不过通常来说,我们不需要知道怎么使用 API 的方式来使用springframework BeanFactory 工厂,只需要知道怎么获取对象即可。
二、Mybatis 的数据源工厂-DataSourceFactory
在 Mybatis 中有一个典型的工厂方法模式的使用。
回顾一下工厂方法模式的特点,来看 工厂模式 讲解案例中的关于工厂方法模式逻辑图:
从图中,能够知道工厂方法的两个特点:
1、将复杂对象,或者复杂对象的构建流程,从代码中抽离到简单工厂中。
2、简单工厂将对象的构建细分到每个对象各自的工厂中。
将 Mybatis 中的 DataSourceFactory
结合上述的工厂方法逻辑图进行分析,
首先,Mybatis 默认提供了三种 DataSource 的实现,分别是:
- JndiDataSource
- PooledDataSource
- UnpooledDataSource
而针对这三种 DataSource 的实现提供了三个工厂进行对象的获取,分别是
- JndiDataSourceFactory
- PooledDataSourceFactory
- UnpooledDataSourceFactory
从这里看整个工厂方法模式已经初具模型,现在就缺一个用来获取这些工厂的工厂方法(工厂方法就是用来获取工厂的方法,可以是某个单独的简单工厂类中,也可以是某个常规类的方法)了。
Mybatis 中数据源工厂的获取方法为 TypeAliasRegistry
中的 resolveAlias()
,该方法就是工厂方法。
以上就是 Mybatis 获取 DataSource
使用到的设计模式:工厂方法模式
小贴士: TypeAliasRegistry 中工厂的数据存放在
Map<String, Class<?>> TYPE_ALIASES
中,而工厂数据初始化在Configuration
构造函数中
【公众号】花好夜猿