MyBatis核心对象的作用域 单例原型
时间: 2025-02-09 12:19:27 浏览: 33
### MyBatis 核心对象作用域:单例 vs 原型
#### 单例模式下的MyBatis核心对象
在单例模式下,MyBatis的核心对象在整个应用程序生命周期内只会被创建一次,并且该实例会被共享给所有的请求。这意味着对于同一个类加载器而言,在任何地方获取到的对象都是相同的实例。
- **SqlSessionFactory**: 这是一个重量级的对象,通常配置为单例。它负责读取配置文件、构建映射信息以及生产`SqlSession`实例。由于其初始化成本较高,因此适合设置成单例来提高性能[^1]。
```java
public class SqlSessionFactorySingleton {
private static final SqlSessionFactory sqlSessionFactory;
static {
try {
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public static SqlSessionFactory getSqlSessionFactory() {
return sqlSessionFactory;
}
}
```
#### 原型模式下的MyBatis核心对象
相比之下,原型模式意味着每次当容器接收到对该类型的bean定义的请求时都会新创建一个新的实例返回给客户端使用。这种方式适用于那些状态会随时间变化而不希望影响其他使用者的情况。
- **SqlSession**: 此接口提供了执行SQL命令所需的所有方法。它是线程不安全的设计,所以应该将其视为临时资源,在操作完成后立即关闭。为了确保每个业务逻辑单元拥有独立的操作环境,建议将`SqlSession`设为原型作用域[^4]。
```java
// 获取新的 SqlSession 实例用于数据库交互
try(SqlSession session = sqlSessionFactory.openSession()){
// 执行CRUD操作...
} catch(Exception ex){
logger.error(ex.getMessage(), ex);
}
```
#### 使用场景对比
| 特性 | 单例 (`singleton`) | 原型 (`prototype`) |
| --- | --- | --- |
| 创建时机 | 应用启动时一次性创建完成 | 每次请求都重新创建 |
| 生命周期长度 | 整个应用运行期间一直存在 | 请求结束即销毁 |
| 资源消耗情况 | 较低,因为只需要维护一个实例 | 相对较高,频繁创建和销毁可能带来额外开销 |
| 是否支持并发访问 | 是,但需注意内部成员变量的状态同步问题 | 否,除非特别设计 |
通过上述分析可以看出,针对像`SqlSessionFactory`这样的重载组件应当优先考虑采用单例策略;而对于类似于`SqlSession`这样轻量级且具有上下文特性的实体,则更适合运用原型机制以保障数据隔离性和安全性[^5]。
阅读全文
相关推荐

















