sqlSessionFactory创建

sqlSessionFactory创建前言分析上篇文章的整合的配置文件,我们可以知道配置的bean是成树状结构的,而在树的最顶层是类型为org.mybatis.Spring.SqlSessionFactoryBean的bean,它将其他相关的bean组装在了一起,那么我们的分析就从此类开始。sqlSessionFactory创建对于配置文件的读取,Spring是通过org.mybatis.Spring.SqlSessi…

大家好,又见面了,我是你们的朋友全栈君。

 前言

分析上篇文章的整合的配置文件,我们可以知道配置的bean是成树状结构的,而在树的最顶层是类型为org.mybatis.Spring.SqlSessionFactoryBean的bean,它将其他相关的bean组装在了一起,那么我们的分析就从此类开始。

sqlSessionFactory创建

 对于配置文件的读取,Spring是通过org.mybatis.Spring.SqlSessionFactoryBean封装了MyBatis中的实现。首先来看一下这个类的类图:

sqlSessionFactory创建

根据上图对两个感兴趣的接口FactoryBean和InitializingBean。

  ❤ InitializingBean:实现此接口的bean会在初始化时调用其afterPropertiesSet方法来进行bean的逻辑初始化。

  ❤ FactoryBean:一旦某个bean实现此接口,那么通过getBean方法获取bean时其实是获取此类的getObject返回的实例。

1.sqlSessionFactoryBean的初始化

 查看org.mybatis.Spring.SqlSessionFactoryBean类型的bean在初始化时做了哪些逻辑实现。

public void afterPropertiesSet() throws Exception {
        Assert.notNull(this.dataSource, "Property 'dataSource' is required");
        Assert.notNull(this.sqlSessionFactoryBuilder, "Property 'sqlSessionFactoryBuilder' is required");
        Assert.state(this.configuration == null && this.configLocation == null || this.configuration == null || this.configLocation == null, "Property 'configuration' and 'configLocation' can not specified with together");
        this.sqlSessionFactory = this.buildSqlSessionFactory();
    }

很显然,此函数的主要目的是对于sqlSessionFactory的初始化,sqlSessionFactory是所有MyBatis功能的基础。

protected SqlSessionFactory buildSqlSessionFactory() throws IOException { XMLConfigBuilder xmlConfigBuilder = null; Configuration configuration; if (this.configuration != null) { configuration = this.configuration; if (configuration.getVariables() == null) { configuration.setVariables(this.configurationProperties); } else if (this.configurationProperties != null) { configuration.getVariables().putAll(this.configurationProperties); } } else if (this.configLocation != null) { xmlConfigBuilder = new XMLConfigBuilder(this.configLocation.getInputStream(), (String)null, this.configurationProperties); configuration = xmlConfigBuilder.getConfiguration(); } else { if (LOGGER.isDebugEnabled()) { LOGGER.debug("Property 'configuration' or 'configLocation' not specified, using default MyBatis Configuration"); } configuration = new Configuration(); if (this.configurationProperties != null) { configuration.setVariables(this.configurationProperties); } } if (this.objectFactory != null) { configuration.setObjectFactory(this.objectFactory); } if (this.objectWrapperFactory != null) { configuration.setObjectWrapperFactory(this.objectWrapperFactory); } if (this.vfs != null) { configuration.setVfsImpl(this.vfs); } String[] typeHandlersPackageArray; String[] var4; int var5; int var6; String packageToScan; if (StringUtils.hasLength(this.typeAliasesPackage)) { typeHandlersPackageArray = StringUtils.tokenizeToStringArray(this.typeAliasesPackage, ",; \t\n"); var4 = typeHandlersPackageArray; var5 = typeHandlersPackageArray.length; for(var6 = 0; var6 < var5; ++var6) { packageToScan = var4[var6]; configuration.getTypeAliasRegistry().registerAliases(packageToScan, this.typeAliasesSuperType == null ? Object.class : this.typeAliasesSuperType); if (LOGGER.isDebugEnabled()) { LOGGER.debug("Scanned package: '" + packageToScan + "' for aliases"); } } } int var27; if (!ObjectUtils.isEmpty(this.typeAliases)) { Class[] var25 = this.typeAliases; var27 = var25.length; for(var5 = 0; var5 < var27; ++var5) { Class<?> typeAlias = var25[var5]; configuration.getTypeAliasRegistry().registerAlias(typeAlias); if (LOGGER.isDebugEnabled()) { LOGGER.debug("Registered type alias: '" + typeAlias + "'"); } } } if (!ObjectUtils.isEmpty(this.plugins)) { Interceptor[] var26 = this.plugins; var27 = var26.length; for(var5 = 0; var5 < var27; ++var5) { Interceptor plugin = var26[var5]; configuration.addInterceptor(plugin); if (LOGGER.isDebugEnabled()) { LOGGER.debug("Registered plugin: '" + plugin + "'"); } } } if (StringUtils.hasLength(this.typeHandlersPackage)) { typeHandlersPackageArray = StringUtils.tokenizeToStringArray(this.typeHandlersPackage, ",; \t\n"); var4 = typeHandlersPackageArray; var5 = typeHandlersPackageArray.length; for(var6 = 0; var6 < var5; ++var6) { packageToScan = var4[var6]; configuration.getTypeHandlerRegistry().register(packageToScan); if (LOGGER.isDebugEnabled()) { LOGGER.debug("Scanned package: '" + packageToScan + "' for type handlers"); } } } if (!ObjectUtils.isEmpty(this.typeHandlers)) { TypeHandler[] var28 = this.typeHandlers; var27 = var28.length; for(var5 = 0; var5 < var27; ++var5) { TypeHandler<?> typeHandler = var28[var5]; configuration.getTypeHandlerRegistry().register(typeHandler); if (LOGGER.isDebugEnabled()) { LOGGER.debug("Registered type handler: '" + typeHandler + "'"); } } } if (this.databaseIdProvider != null) { try { configuration.setDatabaseId(this.databaseIdProvider.getDatabaseId(this.dataSource)); } catch (SQLException var24) { throw new NestedIOException("Failed getting a databaseId", var24); } } if (this.cache != null) { configuration.addCache(this.cache); } if (xmlConfigBuilder != null) { try { xmlConfigBuilder.parse(); if (LOGGER.isDebugEnabled()) { LOGGER.debug("Parsed configuration file: '" + this.configLocation + "'"); } } catch (Exception var22) { throw new NestedIOException("Failed to parse config resource: " + this.configLocation, var22); } finally { ErrorContext.instance().reset(); } } if (this.transactionFactory == null) { this.transactionFactory = new SpringManagedTransactionFactory(); } configuration.setEnvironment(new Environment(this.environment, this.transactionFactory, this.dataSource)); if (!ObjectUtils.isEmpty(this.mapperLocations)) { Resource[] var29 = this.mapperLocations; var27 = var29.length; for(var5 = 0; var5 < var27; ++var5) { Resource mapperLocation = var29[var5]; if (mapperLocation != null) { try { XMLMapperBuilder xmlMapperBuilder = new XMLMapperBuilder(mapperLocation.getInputStream(), configuration, mapperLocation.toString(), configuration.getSqlFragments()); xmlMapperBuilder.parse(); } catch (Exception var20) { throw new NestedIOException("Failed to parse mapping resource: '" + mapperLocation + "'", var20); } finally { ErrorContext.instance().reset(); } if (LOGGER.isDebugEnabled()) { LOGGER.debug("Parsed mapper file: '" + mapperLocation + "'"); } } } } else if (LOGGER.isDebugEnabled()) { LOGGER.debug("Property 'mapperLocations' was not specified or no matching resources found"); } return this.sqlSessionFactoryBuilder.build(configuration); }

从函数中可以看到,尽管我们还是习惯于将MyBatis的配置和Spring的配置独立出来,但是,这并不代表Spring中的配置不支持直接配置。也就是说,在上篇文章的示例中,完全裤取消配置中的configLocation属性,而把其中的属性直接写在sqlSessionFactoryBean中。

从这个函数中还可以得知,配置文件还可以支持其他多种属性的配置,如configLocation、objectFactory、objectWrapperFactory、typeAliasesPackage、typeAliases、typeHandlersPackage、plugins、typeHandlers、transactionFactory、databaseIdProvider、mapperLocations。

其实,如果只按照常用的配置,那么我们只需要在函数最开始按照如下方式处理configLocation:

   xmlConfigBuilder = new XMLConfigBuilder(this.configLocation.getInputStream(),null,this.configurationProperties); configuration = xmlConfigBuilder.getConfiguration();

 根据configLocation构造XMLConfigBuilder并进行解析,但是,为了体现Spring更强大的兼容性,Spring还整合了MyBatis中其他属性的注入,并通过实例configuration来承载每一步所获取的信息并最终使用sqlSessionFactoryBuilder实例根据解析到的configuration创建sqlSessionFactory实例。

2.获取SqlSessionFactoryBean实例

 由于sqlSessionFactoryBean实现了FactoryBean接口,所以当通过getBean方法获取对应实例时,其实是获取该类的getObject函数返回的实例,也就是获得初始化后的sqlSessionFactory属性。

public SqlSessionFactory getObject() throws Exception { if (this.sqlSessionFactory == null) { this.afterPropertiesSet(); } return this.sqlSessionFactory; }

 参考:《Spring源码深度解析》 郝佳 编著: 

转载于:https://www.cnblogs.com/Joe-Go/p/10255301.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/140666.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 购买虚拟服务器(服务器与虚拟服务器)

    【新挑战】十二职业虚拟机整合一键端图文架设修改教程封面.jpg(62.69KB,下载次数:19)2019-5-2119:52上传十几年前的视频没有高清的,那时候觉得妹纸很漂亮,不过唱的就…原来游戏里可以开播放器有这歌,很燃很暴力【游戏设置】源端只有服务端没有配套客户端,所以我整合了一个能用的客户端,但不是很匹配,任务可以接不能完成支持64位WIN7\WIN10整合服务端,虚拟机一键…

  • mysql管理工具navicat_mysql自带的管理工具

    mysql管理工具navicat_mysql自带的管理工具摘自:http://www.chinaz.com/free/2009/0306/68691.shtmlMySQL是一个非常流行的小型关系型数据库管理系统,2008年1月16号被Sun公司收购。目前M

  • Cocos2d-x教程(30)-3.x版本号物理引擎的使用

    Cocos2d-x教程(30)-3.x版本号物理引擎的使用

  • 热插拔——矿机先行利器[通俗易懂]

    热插拔——矿机先行利器[通俗易懂]IPFSFilecoin上线在即,准备挖矿的小伙伴们已近磨刀霍霍了,都在积极选择自己心仪的矿机。但是如今市场上矿机众多,对于矿机的配置也是众说纷纭,相信许多的小伙伴也是十分茫然,当然,星际魔方今天只谈专业IPFS矿机,家用电脑组装的矿机我们后期再谈。工欲善其事,必先利其器。Fliecoin挖矿就是一种优质资源竞争的行为。形象理解就类似于嘀嘀打车,一个人想去另一个地方,在滴滴下单,司机开始抢单…

  • Mysql 截取字符串总结

    Mysql 截取字符串总结MySQL字符串截取函数:left(),right(),substring(),substring_index()。还有mid(),substr()。其中,mid(),substr()等价于substring()函数,substring()的功能非常强大和灵活。1.字符串截取:left(str,length)2.字符串截取:right(str,length)  …

  • btav狼php,www.bvlang5.com[通俗易懂]

    btav狼php,www.bvlang5.com[通俗易懂]DomainName:BVLANG5.COMRegistryDomainID:2183015930_DOMAIN_COM-VRSNRegistrarWHOISServer:whois.namesilo.comRegistrarURL:http://www.namesilo.comUpdatedDate:2017-11-04T09:00:14ZCreationDate:2…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号