spring SqlSessionFactoryBean创建SqlSessionFactory

Spring:FactoryBean<T>接口+SqlSessionFactoryBean创建会话工厂 问题 Spring项目整合MyBatis时使用MyBatis-Spring,配置回话工厂时使用如下代码。 分析:在基础的MyBatis用法中是通过SqlSessionFactoryBuilder来创建SqlSessionFactory的。而在MyBatis-Spring中,则使用SqlSessionFactoryBean创建SqlSessionFactory。 <!-- MyBatis会话工... 阅读详情

原文地址:http://blog.youkuaiyun.com/wdyr321/article/details/11763979

Application.xml

[xml]  view plain  copy
  1. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  
  2.   <property name="dataSource" ref="dataSource" />  
  3.   <property name="configLocation" value="classpath:SQL_MAP_SERVICE_CONFIG.xml" />  
  4. </bean>  
创建SqlSessionFactory
[java]  view plain  copy
  1. ApplicationContext ctx = new ClassPathXmlApplicationContext("APPLICATION.xml");  
  2. SqlSessionFactory sqlSessionFactory=(SqlSessionFactory) ctx.getBean("sqlSessionFactory");  

为什么返回的是SqlSessionFactory对象而不是SqlSessionFactoryBean
首先spring在初始化的时候会将所有创建的单例以Map<K,V>的形式放入singletonObjects,同时调用FactoryBean的getObject()将返回的对象以Map<K,V>的形式放入factoryBeanObjectCache

如{sqlSessionFactory=org.apache.ibatis.session.defaults.DefaultSqlSessionFactory@d997f9}


然后getBean的时候,spring利用getSingleton从singletonObjects获取单例(这里是SqlSessionFactoryBean对象),判断是否实现了FactoryBean接口,若实现了就从factoryBeanObjectCache利用beanname(这里是sqlSessionFactory)重新获取,若未实现则返回getSingleton获取的单例

初始化的源码有些复杂,理不清,下面仅仅是getBean的源码:

1、首先调用的是ClassPathXmlApplicationContext父类AbstractRefreshableApplicationContext的父类AbstractApplicationContext的getBean()。

[java]  view plain  copy
  1. public Object getBean(String name) throws BeansException {  
  2.     return getBeanFactory().getBean(name);  
  3. }  
2、调用AbstractRefreshableApplicationContext的getBeanFactory()返回ConfigurableListableBeanFactory接口实现类DefaultListableBeanFactory
[java]  view plain  copy
  1.       
  2. @Override(重写了AbstractApplicationContext的getBeanFactory抽象方法)  
  3.     public final ConfigurableListableBeanFactory getBeanFactory() {  
  4.         synchronized (this.beanFactoryMonitor) {  
  5.             if (this.beanFactory == null) {  
  6.                 throw new IllegalStateException("BeanFactory not initialized or already closed - " +  
  7.                         "call 'refresh' before accessing beans via the ApplicationContext");  
  8.             }  
  9.             return this.beanFactory;  
  10.         }  
  11.     }  
3、调用DefaultListableBeanFactory的父类AbstractBeanFactory的geBean()
[java]  view plain  copy
  1.       
  2. public Object getBean(String name) throws BeansException {  
  3.         return doGetBean(name, null, null, false);  
  4.     }  
4、调用AbstractBeanFactory的doGetBean()
[java]  view plain  copy
  1.       
  2. protected  T doGetBean(  
  3.             final String name, final Class requiredType, final Object[] args, boolean typeCheckOnly)  
  4.             throws BeansException {  
  5.   
  6.         final String beanName = transformedBeanName(name);  
  7.         Object bean;  
  8.   
  9.         // Eagerly check singleton cache for manually registered singletons.  
  10.         Object sharedInstance = getSingleton(beanName);//根据bean路径获取单例  
  11.         if (sharedInstance != null && args == null) {  
  12.             if (logger.isDebugEnabled()) {  
  13.                 if (isSingletonCurrentlyInCreation(beanName)) {  
  14.                     logger.debug("Returning eagerly cached instance of singleton bean '" + beanName +  
  15.                             "' that is not fully initialized yet - a consequence of a circular reference");  
  16.                 }  
  17.                 else {  
  18.                     logger.debug("Returning cached instance of singleton bean '" + beanName + "'");  
  19.                 }  
  20.             }  
  21.             bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);  
  22.         }  
5、调用AbstractBeanFactory的getObjectForBeanInstance(),判断是否实现FactoryBean接口,若未实现则返回上一步创建的单例
[java]  view plain  copy
  1.       
  2. protected Object getObjectForBeanInstance(  
  3.             Object beanInstance, String name, String beanName, RootBeanDefinition mbd) {  
  4.   
  5.         // Don't let calling code try to dereference the factory if the bean isn't a factory.  
  6.         if (BeanFactoryUtils.isFactoryDereference(name) && !(beanInstance instanceof FactoryBean)) {  
  7.             throw new BeanIsNotAFactoryException(transformedBeanName(name), beanInstance.getClass());  
  8.         }  
  9.   
  10.         // Now we have the bean instance, which may be a normal bean or a FactoryBean.  
  11.         // If it's a FactoryBean, we use it to create a bean instance, unless the  
  12.         // caller actually wants a reference to the factory.  
  13.         if (!(beanInstance instanceof FactoryBean) || BeanFactoryUtils.isFactoryDereference(name)) {  
  14.             return beanInstance;  
  15.         }//判断是否实现FactoryBean接口  
  16.   
  17.         Object object = null;  
  18.         if (mbd == null) {  
  19.             object = getCachedObjectForFactoryBean(beanName);//从factoryBeanObjectCache中取出FactoryBean创建的对象  
  20.         }  
  21.         if (object == null) {  
  22.             // Return bean instance from factory.  
  23.             FactoryBean factory = (FactoryBean) beanInstance;  
  24.             // Caches object obtained from FactoryBean if it is a singleton.  
  25.             if (mbd == null && containsBeanDefinition(beanName)) {  
  26.                 mbd = getMergedLocalBeanDefinition(beanName);  
  27.             }  
  28.             boolean synthetic = (mbd != null && mbd.isSynthetic());  
  29.             object = getObjectFromFactoryBean(factory, beanName, !synthetic);  
  30.         }  
  31.         return object;  
  32.     }  
博途的HMI(触摸屏)的应用 触摸屏(HMI):用于控制PLC,可认为是小型上位机(用于控制PLC的都可认为是上位机)上位机(PC Station):将触摸屏升级为电脑----工控机(工业控制的机器)用博途编写西门子的触摸屏和上位机。 阅读详情

相关推荐

哨兵一号数据snap预处理_利用SNAP软件进行Sentinel-1A卫星微波影像的预处理

利用SNAP软件对雷达影像进行预处理,主要包括热噪声去除、轨道文件校正、辐射定标、滤波校正、多普勒地形校正,最终获得入射角和后向散射信息。数据:本次实验所用数据为哨兵一号(Sentinel-1A)干涉宽幅模式(Interferometric Wideswath,IW)下经过多视处理和地距转换的GRD格式产品一般处理流程如下:0 SNAP软件安装软件安装:安装成功后打开SNAP后如图所示:1 数据...

weixin_30000407的博客 1万+

1、SqlSessionFactoryBean的创建-1

一、SqlSessionFactoryBean概览 与spring进行整合的时候,通常我们会配置以下信息 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource">&lt...

zhen_hong的博客 5868

Qt 5.9.1 32位下,手把手搞定周立功CAN二次开发库的加载与配置(含常见错误排查)

本文详细介绍了在Qt 5.9.1 32位环境下配置周立功CAN二次开发库的完整流程,包括环境准备、项目配置、常见错误排查及性能优化建议。特别针对MinGW 32bit环境,提供了.pro文件的精准配置和DLL部署策略,帮助开发者快速解决库文件匹配、编译报错和运行时问题,实现高效的CAN总线通信开发。

weixin_28717431的博客 356

MyBatis入门系列(22) -MyBatis-Spring核心源码解析之SqlSessionFactoryBean

前言 在之前使用了mybatis的文档中,我们需要手动创建SqlSessionFactory对象来获取SqlSession,然后通过SqlSession获取mapper代理对象,进行数据库操作。 // 根据xml配置文件(全局配置文件)创建一个SqlSessionFactory对象 String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); Sql

记录知识、锤炼自我 5785

直流有刷电机控制 - 认识电机(一)

电机控制学习

u011030644的博客 917

无人机频谱侦测与智能识别技术实战解析

本文深入解析无人机频谱侦测与智能识别技术实战应用,涵盖无线电侦测、信号处理和定位技术等核心内容。通过频谱分析、特征提取和机器学习算法优化,实现高精度无人机识别与定位,并分享复杂环境下的应对策略和系统集成经验。

weixin_28419039的博客 489

mybatis-spring学习之SqlSessionFactoryBean

&lt;bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"&gt; &lt;property name="dataSource" ref="dataSource"/&gt; &lt;property name="typeAliasesPackage"

chpllp的博客 2316

uniapp实战:mui-player插件如何完美适配m3u8/flv直播流(附完整代码)

本文详细介绍了如何在Uniapp中使用mui-player插件完美适配m3u8和flv直播流,提供从基础配置到高级优化的全流程解决方案。通过动态加载策略、响应式布局和内存管理,实现跨平台稳定播放,适用于企业级直播应用开发。

weixin_29001655的博客 237

SqlSessionFactory的理解

SqlSessionFactory的理解

m0_65712857的博客 243

社交媒体文章内容与评论抓取:Python 爬虫实战教程

通过本文的介绍,我们学习了如何使用 Python 编写爬虫,抓取社交媒体平台的文章内容和评论。我们详细介绍了如何使用requestsSelenium和Tweepy等工具,抓取微博和 Twitter 上的公开数据。同时,我们还讨论了如何处理反爬虫机制,避免账号或 IP 被封禁。抓取社交媒体数据是一个充满挑战和乐趣的过程,掌握这些技术后,你可以在大数据分析、情感分析和舆情监测等方面得到更深层次的应用。

2201_76125261的博客 1710

开源GIS -- 笔记

基础开发库 数据读写:GDAL/OGR(C/C++) ArcGIS和GE都是使用此工具 投影转换:Proj.4(C/C++) 拓扑计算:JTS(Java),GEOS(C++),Shapely(python) 组件式开发库 GeoTools(Java),DotSpatial(.NET) 空间分析: Scipy(通用科学计算、方程求解), numpy,NextworkX, rPy(统计分析), Scikit-learn,pysal(空间分析) 深度学习: Keras、 tensorflow、 pytor

DZ Space 4521

spring-mybatis 之SqlSessionFactoryBean

在 MyBatis 中,使用 SqlSessionFactoryBuilder创建SqlSessionFactory ,进而来创建 SqlSession。一旦你获得一个 session 之后,你可以使用它来执行映射语句,提交或回滚连接,最后,当不再需要它的时候, 你可以关闭 session。  Mybatis社区自己开发了一个Mybatis-Spring用来满足Mybatis用户整合Spring

赶路人儿 5万+

飞牛fnNAS搭建Web网页版OFFICE(WPS)软件

本文介绍了如何在飞牛NAS上通过Docker容器部署WPS Office办公软件。主要内容包括:启用Docker服务、准备项目文件夹结构、使用Compose方式构建容器、解决端口冲突问题、配置中文输入法和字体库,以及通过ZeroTier实现远程访问。文章详细说明了每个步骤的操作方法,包括容器启动、输入法设置、字体添加和文件存储位置配置。最后还介绍了使用ZeroTier内网穿透技术实现远程访问NAS上WPS服务的方法,让用户可以在不同设备上随时编辑NAS中的文件。整个部署过程完整清晰,为NAS用户提供了便捷的

dgnankai的专栏 1701

【MyBatis】Spring集成原理(一):创建 SqlSessionFactory

这里我们以传统的Spring为例,因为配置更直观,在Spring中使用配置类注解是一样的。在前面的课程里面,我们基于编程式的工程已经弄清楚了MyBatis的工作流程、核心模块和底层原理。编程式的工程,也就是MyBatis的原生API里面有三个核心对象:SqlSessionFactory、SqlSession、MapperProxy。 大部分时候我们不会在项目中单独使用MyBatis的工程,而是集成到Spring里面使用,但是却没有看到这三个对象在代码里面的出现。我们直接注入了一个Mapper接口,调用它的方

A minor 2070

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Spring整合MyBatis:SqlSessionFactoryBean【基础】

SqlSessionFactoryBean 是一个负责生产 SqlSessionFactory 的工厂 Bean, 当想从容器中获取 SqlSessionFactory 对象时,Spring 会调用其 getObject() 方法进行获取。

mrguif的博客 3102

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【众筹网项目】项目重复创建sqlsessionfactory[DEBUG]-[org.mybatis.spring.SqlSessionFactoryBean...

今天在做开发项目的时候出现一直在控制台重复输出创建sqlsessionfactory'这个代码 1.首先很大可能是mapper.xml文件出现了问题; 2.然后在控制台找问题,应该会有一个xxxMapper创建失败的error或者对象resolve等等操作失败的消息; 3.确定了错误的mapper文件之后,仔细观察每一个SQL语句是否有id重复,或者输入参数,输出参数写错的,写错就可能导...

zzf_forgot的博客 598

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

MyBatis 与 Spring 整合原理:SqlSessionFactory 是如何创建的

基于源码深度解析,MyBatis 与 Spring 整合原理:SqlSessionFactory 是如何创建的

m0_57877510的博客 214

关于SqlSessionFactoryBean

在基础的 MyBatis 用法中,是通过 SqlSessionFactoryBuilder 来创建 SqlSessionFactory 的,而在 MyBatis-Spring 中,则使用 SqlSessionFactoryBean 来创建。要创建工厂 bean,将下面的代码放到 Spring 的 XML 配置文件中: <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <prope

qq_40492885的博客 2191

Mybatis-Spring 的高级配置 (SqlSessionFactoryBean)

一、SqlSessionFactoryBean mybatis-spring 官网 在基本的 MyBatis 中,session 工厂可以使用 SqlSessionFactoryBuilder 来创建。而在 MyBatis-spring 中,则使用SqlSessionFactoryBean 来替代:   &lt;bean id="sqlSessionFactory" class="...

bingguang1993的博客 4024

谈谈SqlSessionFactoryBean和MapperScannerConfigurer

谈谈SqlSessionFactoryBean和MapperScannerConfigurer 这两个类会在我们使用dao的时候扫描的时候会用到,如果我们不想创建一个Mapper接口类的实现类的话(通常spring管理Mybatis的mapper对象的时候都需要创建一个接口实现类来做做对数据库的操作,不然没办法访问到Mapper.xml的代理类,这个代理类通常是SqlSession来创建的) 先给出代码 <bean class="org.mybatis.spring.SqlSessionFa

m0_46388866的博客 1470

MyBatis-Spring-SqlSessionFactoryBean

MyBatis-Spring-SqlSessionFactoryBean 详解

找寻你的足迹123 3045

SqlSessionFactoryBean详解

文章目录官方学习地址作用代码分析buildSqlSessionFactory方法 官方学习地址 官网:http://mybatis.org/spring/zh/factorybean.html 作用 代码分析 类图: 继承的接口: InitializingBean:这个接口的作用是spring初始化的时候会执行实现了InitializingBean接口的afterPropertiesSet方法;具体怎么执行暂时就不说了; ApplicationListener接口作用是在spring容器执行的各个阶段进

你就像甜甜的益达 1万+

SqlSessionFactoryBean的构建流程

目的 此文的主旨在于梳理SqlSessionFactoryBean的初始流程,不拘泥于实现细节。 使用 SqlSessionFactoryBean的主要作用便是用来创建SqlSessionFactory,在它的构建过程中会解析MyBatis所需要的配置文件,将所有配置都封装到Configuration类中,最后返回SqlSessionFactory实例。SqlSessionFactoryBean实...

weixin_30652897的博客 1227

通过纯注解对SqlSessionFactoryBean进行实例化,换而言之就是把SqlSessionFactory对象交给IOC容器去管理。

第一步: Spring配置类,主要目的为了把注解所标记的Bean扫描到IOC容器中 第二步:把SqlSessionFactoryBean交给Spring进行实例化, 但是需要进行依赖注入,也就是DataSource package com.ligong.config; import com.alibaba.druid.pool.DruidDataSource; import org.mybatis.spring.SqlSessionFactoryBean; import org.springframe.

helpluozhao123的博客 1592

mybatis与spring集成中SqlSessionFactory创建流程

Mybatis作为优秀且广泛使用的轻量级持久层框架经常与Spring集成一起使用,集成过程中sqlSessionFactory的创建流程是什么样的呢?本文结合mybatis、mybatis-spring源码以及UML时序图的方式阐述如何进行: 以下为Mybatis与Spring集成的部分配置,主要是涉及SqlSessionFactory bean:

探索java技术、web技术 3166
上一篇: slf4j错误
下一篇: 浅谈数据库用户表结构设计,第三方登录
Mask_V
博客等级 码龄9年 7粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值