SqlSessionFactoryBuilder
在 MyBatis 中扮演着至关重要的角色,它的主要作用是构建 (Build) SqlSessionFactory
实例。 你可以将 SqlSessionFactoryBuilder
理解为 SqlSessionFactory
的工厂的建造者。
核心作用概括:
SqlSessionFactoryBuilder
的核心作用就是 抽象了 SqlSessionFactory
的创建过程,并提供了灵活、便捷的方式来从不同的配置源 (XML 配置文件、Java 代码配置) 构建 SqlSessionFactory
实例。
更详细的解释和作用分解:
抽象
SqlSessionFactory
的构建过程:SqlSessionFactory
的创建并非一个简单的实例化过程,它涉及到加载和解析 MyBatis 的配置信息、初始化各种 MyBatis 组件 (例如数据源、事务管理器、Mapper 注册器等)、并将这些组件组装起来,最终才能得到一个可用的SqlSessionFactory
实例。SqlSessionFactoryBuilder
将这个复杂的构建过程封装起来,对外提供简洁的build()
方法,隐藏了内部的构建细节。 开发者只需要调用SqlSessionFactoryBuilder.build()
方法,传入配置信息,就可以获得SqlSessionFactory
实例,无需关心底层的构建细节。
支持多种配置源 (Configuration Source):
SqlSessionFactoryBuilder
提供了多个重载的build()
方法,可以接受不同类型的配置源,从而支持从多种方式加载 MyBatis 配置:- 从 XML 配置文件 (
InputStream
): 这是最常用的方式,通过build(InputStream inputStream)
方法,传入指向 MyBatis XML 配置文件的InputStream
,SqlSessionFactoryBuilder
会解析 XML 文件并构建SqlSessionFactory
。 - 从
Configuration
对象 (Configuration
): 通过build(Configuration config)
方法,可以直接传入一个已经构建好的Configuration
对象。 这种方式适用于使用 Java 代码配置 MyBatis 的场景。 - 从
Reader
对象 (Reader
): 类似于InputStream
,但使用Reader
读取字符流,适用于从字符流读取 XML 配置的情况。 - 从
XMLMapperBuilder
对象 (XMLMapperBuilder
): 更底层的构建方式,通常不直接使用,用于更精细的配置解析控制。
这种多配置源的支持,使得 MyBatis 的配置方式更加灵活,可以适应不同的应用场景和配置管理需求。
- 从 XML 配置文件 (
作为
SqlSessionFactory
的建造者 (Builder Pattern):SqlSessionFactoryBuilder
遵循了 建造者模式 (Builder Pattern) 设计模式。 建造者模式的核心思想是将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。在 MyBatis 中:
- 建造者 (Builder):
SqlSessionFactoryBuilder
类。 - 产品 (Product):
SqlSessionFactory
接口及其实现类 (通常是DefaultSqlSessionFactory
)。 - 导演 (Director - 隐含):
SqlSessionFactoryBuilder.build()
方法及其内部的解析和构建逻辑,它控制着SqlSessionFactory
的构建步骤。 - 具体建造者 (Concrete Builder - 隐含):
XMLConfigBuilder
等类,负责解析 XML 配置并填充Configuration
对象,可以看作是SqlSessionFactoryBuilder
构建过程中的具体步骤的实现。
通过建造者模式,
SqlSessionFactoryBuilder
使得SqlSessionFactory
的创建过程更加清晰、可维护、可扩展。 也使得配置加载和SqlSessionFactory
的创建逻辑解耦,提高了代码的灵活性。- 建造者 (Builder):
一次性使用,生命周期短暂:
SqlSessionFactoryBuilder
的设计意图是 一次性使用 (One-time use) 的。 它的生命周期很短暂,主要用于构建SqlSessionFactory
实例。 一旦SqlSessionFactory
被成功构建,SqlSessionFactoryBuilder
就完成了它的使命,可以被丢弃,不再需要长期持有。通常,在 MyBatis 应用的启动阶段,你会使用
SqlSessionFactoryBuilder
构建SqlSessionFactory
,然后将SqlSessionFactory
对象缓存起来 (例如作为单例 Spring Bean 管理),供整个应用生命周期使用。 你不会在每次需要SqlSession
时都去创建SqlSessionFactoryBuilder
。核心方法:
build()
方法:SqlSessionFactoryBuilder
的核心方法是build()
方法。 所有重载的build()
方法最终都会返回一个SqlSessionFactory
实例。build()
方法内部会完成以下主要工作:- 解析配置源: 根据传入的配置源 (例如
InputStream
),解析 MyBatis 配置信息。 如果是 XML 配置,会使用XMLConfigBuilder
进行解析。 - 构建
Configuration
对象: 将解析得到的配置信息构建成一个Configuration
对象。Configuration
对象包含了 MyBatis 的所有配置 (数据源、事务管理器、Mapper 映射、全局设置等)。 - 创建
SqlSessionFactory
实例: 使用构建好的Configuration
对象,创建SqlSessionFactory
实例 (通常是DefaultSqlSessionFactory
实例)。 - 返回
SqlSessionFactory
实例: 将创建好的SqlSessionFactory
实例返回给调用者。
- 解析配置源: 根据传入的配置源 (例如
总结 SqlSessionFactoryBuilder
的作用:
- 构建
SqlSessionFactory
实例: 这是SqlSessionFactoryBuilder
的核心和唯一目的。 - 抽象
SqlSessionFactory
的复杂创建过程: 简化SqlSessionFactory
的创建流程,隐藏内部细节。 - 支持多种配置源: 允许从 XML 配置文件、Java 代码配置等多种方式加载 MyBatis 配置。
- 遵循建造者模式: 使得
SqlSessionFactory
的构建过程更加清晰、灵活、可扩展。 - 一次性使用,生命周期短暂: 主要用于构建
SqlSessionFactory
,构建完成后即可丢弃。 - 提供
build()
方法作为入口: 通过build()
方法对外提供简洁的SqlSessionFactory
构建 API。
简单比喻:
你可以将 SqlSessionFactoryBuilder
比喻成一个 组装工厂的工程师。 工程师 (SqlSessionFactoryBuilder
) 负责根据设计图纸 (MyBatis 配置) 和原材料 (配置源),一步步地组装出最终的工厂 ( SqlSessionFactory
)。 一旦工厂组装完成,工程师的任务就完成了,他就可以离开了 (一次性使用)。 而组装好的工厂 (SqlSessionFactory
) 就可以开始源源不断地生产产品 ( SqlSession
) 了。