一、Spring 中的Bean工厂

Springframework 整个框架的功能执行都围绕着底层的IOC容器,而容器中实例对象的创建和获取都是由工厂来完成。
Springframework 定义了工厂接口 BeanFactory,再次基础上定义了具有不同功能的工厂规范,如:可继承的工厂、可配置的工厂。
通过继承,实现、组合一系列操作,组合有各自功能的工厂,以此来实现工厂一个具有多种功能的Bean工厂。
Bean 工厂组合类图,如下:
[设计模式]-[创建型]-工厂-应用案例 - 图1
同时为了应对 Bean 获取的多种场景,springframework bean 工厂提供有多个重载的 getBean 的方法,如下图:
[设计模式]-[创建型]-工厂-应用案例 - 图2
当我们需要获取一个被 Springframework 管理的 Bean 实例对象时,只需要获取对应的 BeanFactory 工厂,调用 getBean 方法即可。
工厂的作用就是用来屏蔽对象的创建, springframework 的工厂构建 Bean对象很复杂,包括配置文件解析,支持 xml形式的配置解析,同样也支持注解式的配置解析,同时还提供有 API 手动注册到工厂。同时还支持懒加载等一系列复杂功能。
不过通常来说,我们不需要知道怎么使用 API 的方式来使用springframework BeanFactory 工厂,只需要知道怎么获取对象即可。

二、Mybatis 的数据源工厂-DataSourceFactory

在 Mybatis 中有一个典型的工厂方法模式的使用。
回顾一下工厂方法模式的特点,来看 工厂模式 讲解案例中的关于工厂方法模式逻辑图:
[设计模式]-[创建型]-工厂-应用案例 - 图3
从图中,能够知道工厂方法的两个特点:
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 构造函数中


【公众号】花好夜猿
wxlogo.jpg