mybatis中工厂模式简单+深入理解

mybatis中工厂模式深入理解

抽象工厂模式定义

抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
mybatis中的工厂模式主要是通过:
SqlSessionFactory
SqlSessionFactoryBuilder
来实现的

1.代码

1.1文字版
在这里插入图片描述

在这里插入图片描述
1.new SqlSessionFactoryBuilder().build(resourceAsStream);
2.build方法根据参数输入流resourceAsStream生成Xmlconfigration
3.调用SqlSessionFactoryBuilder的build(Configration config)方法返回DefaultSqlSessionFactory(SqlSessionFactoryBuilder的一个实现的工厂类)
4.SqlSessionFactory.openSession();
5.调用的是DefaultSqlSessionFactory重写了的opensession方法: openSessionFromDataSource(this.configuration.getDefaultExecutorType(), (TransactionIsolationLevel)null, false);
6.最后返回DefaultSqlSession var8;中的var8,其实就是SqlSession的实现类DefaultSqlSession
说明:重点解释一下被===========围住的代码

public class MybatisUtils {
    private static SqlSessionFactory build = null;

    static {
        try {
            InputStream is = Object.class.getResourceAsStream("/database.properties");
            Properties properties = new Properties();
            properties.load(is);
            String property = properties.getProperty("mybatis.config");
            InputStream resourceAsStream = Resources.getResourceAsStream(property);
            //=================================================
            build = new SqlSessionFactoryBuilder().build(resourceAsStream);
  			//=================================================
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static SqlSession getSqlSession() {
        if (build == null) {
            throw new RuntimeException();
        }
        //=================================================
        return build.openSession();
        //=================================================
    }
}

2.流程如下(以源码形式展开)

跟随注解//xxxxxxxxxxxxxxxx数字顺序观看

public SqlSessionFactory build(InputStream inputStream) {
		//111111111111111111111111111111111111111111
        return this.build((InputStream)inputStream, (String)null, (Properties)null);
    }
public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
        SqlSessionFactory var5;
        try {
            XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
            //2222222222222222222222222222222
            var5 = this.build(parser.parse());
        } catch (Exception var14) {
            throw ExceptionFactory.wrapException("Error building SqlSession.", var14);
        } finally {
            ErrorContext.instance().reset();

            try {
                inputStream.close();
            } catch (IOException var13) {
            }

        }

        return var5;
    }
public SqlSessionFactory build(Configuration config) {
		//333333333333333333333333333333333
        return new DefaultSqlSessionFactory(config);
    }
public DefaultSqlSessionFactory(Configuration configuration) {
		//44444444444444444444444444444444
        this.configuration = configuration;
    }
public SqlSession openSession() {
		//555555555555555555555555555555555这里三个参数分别为执行器,事务隔离级别,是否自动提交
        return this.openSessionFromDataSource(this.configuration.getDefaultExecutorType(), (TransactionIsolationLevel)null, false);
    }
private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {
        Transaction tx = null;

        DefaultSqlSession var8;
        try {
            Environment environment = this.configuration.getEnvironment();
            TransactionFactory transactionFactory = this.getTransactionFactoryFromEnvironment(environment);
            tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);
            Executor executor = this.configuration.newExecutor(tx, execType);
            //6666666666666666666666666666666666666
            var8 = new DefaultSqlSession(this.configuration, executor, autoCommit);
        } catch (Exception var12) {
            this.closeTransaction(tx);
            throw ExceptionFactory.wrapException("Error opening session.  Cause: " + var12, var12);
        } finally {
            ErrorContext.instance().reset();
        }

        return var8;
    }
//777777777777777777777777777777777
public DefaultSqlSession(Configuration configuration, Executor executor, boolean autoCommit) {
        this.configuration = configuration;
        this.executor = executor;
        this.dirty = false;
        this.autoCommit = autoCommit;
    }

最后就返回了创建的session对象

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值