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.     }  
CentOS7.9 安装 ImageMagick,图片转换为HEIC图像格式 由于ImageMagick7以下不支持heic等图片格式,所以重新安装了ImageMagick7.1版本支持heic格式,在网上找了很多资料,归纳总结并写此文章记录一下。在Linux(CentOS7.9)上安装ImageMagick7.1.1-38。 阅读详情

相关推荐

Valeo近场数据集:多模态行人意图检测技术解析

行人意图检测是智能驾驶系统的关键技术,通过分析行人运动轨迹预测其行为意图。传统方法受限于单传感器数据,难以应对复杂场景。多模态融合技术结合视觉、LiDAR和惯性测量数据,显著提升检测精度。Valeo近场数据集(VNF)创新性地采用鱼眼相机、多LiDAR和动作捕捉系统,实现3D姿态与意图标签的精准对齐。该数据集支持开发距离自适应的行人感知算法,在ADAS防碰撞、智能迎宾等场景具有重要应用价值。关键技术包括传感器同步、3D姿态重建和时空图卷积网络,为行业提供了标准化评估基准。

weixin_30566111的博客 660

1、SqlSessionFactoryBean的创建-1

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

zhen_hong的博客 5868

海量Embedding进行相似度查询和比较的方法

这个是在科研中的现实需求。例如每一个源代码文件,我们可以生成一个embedding,如果有超过5000万个embedding(例如用BERT生成5000万个embedding),怎么样有效地计算相似性呢(例如有5000个positive的embedding,想在5000万个中找到类似的)。 简单介绍一下我尝试的结果:如果直接用torch.cosine_similarity,我手里的数据估计至少要处理两个月。这时候就想到了用LSH -- Locality Sensitive Hashing,但是我之前并没怎

qysh123的专栏 4567

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

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

记录知识、锤炼自我 5785

别再手动拷贝文件了!用Keil MDK的Pack Installer一键搞定STM32上的RT-Thread Nano移植

本文详细介绍了如何使用Keil MDK的Pack Installer一键快速移植RT-Thread Nano到STM32项目,告别繁琐的手动拷贝和配置过程。通过自动化版本管理和依赖处理,移植时间从47分钟缩短至3分钟,大幅提升开发效率。文章还提供了实战步骤、高级配置技巧和常见问题解决方案,帮助开发者轻松实现RTOS集成。

weixin_29194817的博客 364

R语言灰色关联分析法

输入数据并用DT包的datatable函数展示数据 ABDDEF分别对应第1到第6个供应商产品质量、技术水平、供应能力、经济效益、交货情况、市场影响度指标属于效益型指 产品价格、地理位置、售后服务指标属于成本型指标。现分别对上述指标进行规范化: 对于效益型指标(正项指标)标准化公式为: x∗=x−min(x)max(x)−min(x) x^{\ast}=\frac{x-min\left( x \right)}{max\left( x \right) -min\left( x \right)} x∗=max

qq_54423921的博客 7996

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

ubuntu20.04屏幕亮度无法调节(亮度条调节无效)的简单靠谱解决方案及踩坑历程

0 前言   网上关于ubuntu系统亮度无法调节的问题的解决方法有很多,但是绝大部分并没有什么用(这也是我自己的亲身体会),或者并不靠谱。在遍尝各路方法过后,我终于解决了这一棘手的问题(毕竟最大亮度真的非常刺眼,无法长时间直视),在此记录一下踩坑历程以及最后的解决方案。 1 Naive方法   由于使用需要,最近在电脑原有的win10基础上安装了ubuntu双系统。我安装的是当前新版的ubuntu20.04.2.0,靠谱的安装教程可以参考这里。   之前师兄说双ssd安装双系统会有系统启动引导的问题出现,

zeeq的博客 4万+

SqlSessionFactory的理解

SqlSessionFactory的理解

m0_65712857的博客 243

【推荐100个unity插件】Unity URP(通用渲染管线)的基于物理的天地和预计算大气散射——UnityPhysicallyBasedSkyURP

本文介绍了Unity URP(通用渲染管线)中基于物理的天地和预计算大气散射的实现方法。该插件提供物理天空、大气散射、高度雾效、动态天空反射和环境光等功能,要求Unity 2022.3及以上版本,支持着色器模型3.5+。使用步骤包括:添加渲染器功能、配置Volume组件(天空、雾效等),并建议太阳强度设为3、曝光为0作为初始设置。插件已在GitHub和Gitee开源,附带详细配置截图和效果展示。文末推荐了多个Unity开发相关专栏,涵盖游戏开发全领域知识。作者向宇提供了博客链接,欢迎交流学习问题。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1228

173、LLC谐振变换器的PCB设计实战(布线)

LLC谐振变换器PCB设计实战要点 LLC谐振变换器的PCB设计核心在于控制寄生参数,避免高频振铃和EMI问题。功率回路需确保电流路径最短且紧耦合,谐振电容焊盘需加宽以减少发热。驱动走线应独立于功率回路,避免干扰,并合理控制宽度和长度。变压器绕组结构影响共模噪声,建议原边在外层并加屏蔽铜箔。地平面设计需根据功率等级选择整块或分割,大功率下功率地与信号地应单点连接。谐振电流采样推荐四端开尔文电阻以减少电感干扰。散热需优化铜皮和过孔布局,功率器件优先放置顶层。布局应先确定谐振腔,再排布控制电路。经验上需实测寄生

Jack010169的博客 46

spring-mybatis 之SqlSessionFactoryBean

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

赶路人儿 5万+

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

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

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

A minor 2070

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Spring整合MyBatis:SqlSessionFactoryBean【基础】

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

mrguif的博客 3102

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

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

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

zzf_forgot的博客 598

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、付费专栏及课程。

余额充值