新人发帖,在这一篇是我申请会员时的文章
SSF构建过程源码分析
首先创建一个SqlSesionFactoryBuilder对象
[Java] [color=rgb(51, 102, 153) !important]纯文本查看 [color=rgb(51, 102, 153) !important]复制代码
[color=white !important]?12345public class SqlSessionFactoryBuilder { public SqlSessionFactoryBuilder() { } //省略其它代码}
其次 SSFB 对象调用 build 方法
[Java] [color=rgb(51, 102, 153) !important]纯文本查看 [color=rgb(51, 102, 153) !important]复制代码
[color=white !important]?123public SqlSessionFactory build(InputStream inputStream) { return this.build((InputStream)inputStream, (String)null, (Properties)null); }
然后然后看他的重载方法
[Java] [color=rgb(51, 102, 153) !important]纯文本查看 [color=rgb(51, 102, 153) !important]复制代码
[color=white !important]?010203040506070809101112131415public 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] [color=rgb(51, 102, 153) !important]纯文本查看 [color=rgb(51, 102, 153) !important]复制代码
[color=white !important]?1return build(parser.parse());
这里有两处注意的地方,parser.parse() 返回一个Configuration 对象,这个对象保罗万千,暂时也不深究。此外build方法的实现如下:
[Java] [color=rgb(51, 102, 153) !important]纯文本查看 [color=rgb(51, 102, 153) !important]复制代码
[color=white !important]?123public SqlSessionFactory build(Configuration config) { return new DefaultSqlSessionFactory(config); }
它返回了 DefaultSqlSessionFactory对象,并且将 Configuration 对象赋值其属性
[Java] [color=rgb(51, 102, 153) !important]纯文本查看 [color=rgb(51, 102, 153) !important]复制代码
[color=white !important]?123456789public class DefaultSqlSessionFactory implements SqlSessionFactory { private final Configuration configuration; public DefaultSqlSessionFactory(Configuration configuration) { this.configuration = configuration; } //这里省略其它代码}
由于 DefaultSqlSessionFactory 实现了 SSF 接口,那麽
[Java] [color=rgb(51, 102, 153) !important]纯文本查看 [color=rgb(51, 102, 153) !important]复制代码
[color=white !important]?1SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
这个就结束了
源码的设计思想
首先先定义SSF接口
[Java] [color=rgb(51, 102, 153) !important]纯文本查看 [color=rgb(51, 102, 153) !important]复制代码
[color=white !important]?12345package com.yefengyu.mybatis; public interface SqlSessionFactory { void test(); }
然后通过编写代码来实现调用接口
[Java] [color=rgb(51, 102, 153) !important]纯文本查看 [color=rgb(51, 102, 153) !important]复制代码
[color=white !important]?010203040506070809101112131415161718192021package 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] [color=rgb(51, 102, 153) !important]纯文本查看 [color=rgb(51, 102, 153) !important]复制代码
[color=white !important]?01020304050607080910111213141516package 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
请求批评指正
声明:本站所有资源均由网友分享,如有侵权内容,请在文章下方留言,本站会立即处理。