SSF构建过程
源码分析
首先创建一个SqlSesionFactoryBuilder对象
[Java] 纯文本查看 复制代码 public class SqlSessionFactoryBuilder {
public SqlSessionFactoryBuilder() {
}
//省略其它代码
}
其次 SSFB 对象调用 build 方法
[Java] 纯文本查看 复制代码 public SqlSessionFactory build(InputStream inputStream) {
return this.build((InputStream)inputStream, (String)null, (Properties)null);
}
R然后咋爱看他的重载方法
[Java] 纯文本查看 复制代码 public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
try {
XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
return build(parser.parse());
} catch (Exception e) {
throw ExceptionFactory.wrapException("Error building SqlSession.", e);
} finally {
ErrorContext.instance().reset();
try {
inputStream.close();
} catch (IOException e) {
// Intentionally ignore. Prefer previous error.
}
}
}
这个构造函数将我们的配置文件转换为 XMLConfigBuilder 对象,这个很复杂,由于时间,加入论坛后再发帖另论
[Java] 纯文本查看 复制代码 return build(parser.parse());
这里有两处注意的地方,parser.parse() 返回一个Configuration 对象,这个对象保罗万千,暂时也不深究。此外build方法的实现如下:
[Java] 纯文本查看 复制代码 public SqlSessionFactory build(Configuration config) {
return new DefaultSqlSessionFactory(config);
}
它返回了 DefaultSqlSessionFactory对象,并且将 Configuration 对象赋值其属性
[Java] 纯文本查看 复制代码 public class DefaultSqlSessionFactory implements SqlSessionFactory {
private final Configuration configuration;
public DefaultSqlSessionFactory(Configuration configuration) {
this.configuration = configuration;
}
//这里省略其它代码
}
由于 DefaultSqlSessionFactory 实现了 SSF 接口,那麽
[Java] 纯文本查看 复制代码 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
这个就结束了
源码的设计思想
首先先定义SSF接口
[Java] 纯文本查看 复制代码 package com.yefengyu.mybatis;
public interface SqlSessionFactory {
void test();
}
然后通过编写代码来实现调用接口
[Java] 纯文本查看 复制代码 package com.yefengyu.mybatis;
import org.apache.ibatis.builder.xml.XMLConfigBuilder;
import org.apache.ibatis.session.Configuration;
import java.io.InputStream;
public class DefaultSqlSessionFactory implements SqlSessionFactory {
private Configuration configuration = null;
public DefaultSqlSessionFactory(InputStream inputStream) {
XMLConfigBuilder parser = new XMLConfigBuilder(inputStream);
this.configuration = parser.parse();
}
@Override
public void test() {
//使用 configuration 完成相关功能
}
}
测试一下
[Java] 纯文本查看 复制代码 package com.yefengyu.mybatis;
import org.apache.ibatis.io.Resources;
import java.io.IOException;
import java.io.InputStream;
public class Main {
public static void main(String[] args) throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new DefaultSqlSessionFactory(inputStream);
sqlSessionFactory.test();
}
}
这种方式也有一定的缺点
就是首先如果有多个SSF实现的话,把 InputStream 转换为 Configuration的过程在每个构造函数都会有。
上面的SSF指的是SqlSessionFactory
SSFB值得是SqlSessionFactoryBuilder
请求批评指正 |