SSF构建过程

爱必应

新人发帖,在这一篇是我申请会员时的文章
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

请求批评指正

声明:本站所有资源均由网友分享,如有侵权内容,请在文章下方留言,本站会立即处理。

原文链接:,转发请注明来源!

发表评论