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.     }  
基于Jira与Confluence的企业知识库AI助手构建实战 检索增强生成(RAG)技术通过结合信息检索与大型语言模型,有效解决了AI在专业领域知识不足的问题。其核心原理是将外部知识库(如企业文档)进行向量化存储,在用户提问时进行语义检索,并将相关上下文注入提示词中,从而生成精准、有据可依的回答。这一技术架构在工程实践中价值显著,它无需重新训练模型即可让AI掌握特定领域的专业知识,大幅提升了回答的准确性与实用性。典型的应用场景包括智能客服、企业内部知识问答以及代码辅助等。本文以开源项目`dev-kostiuk/jira-confluence-ai-context`为例 阅读详情

相关推荐

海上AI导航系统:技术架构与行业应用解析

计算机视觉与强化学习技术在海上导航系统中的应用正逐步改变传统航运业。通过多模态传感器融合技术,现代AI导航系统能够实现高精度的物体识别与实时路径规划,有效解决能见度依赖、决策延迟等核心痛点。以Orca AI的SeaPod系统为例,其结合了NVIDIA GeForce RTX 4070的边缘计算能力与多光谱协同识别技术,在恶劣环境下仍能保持稳定性能。这类系统不仅提升了航行安全性,还通过优化航线显著降低燃油消耗,在东京湾、马六甲海峡等繁忙水域展现出巨大价值。随着毫米波雷达融合方案的测试推进,未来海上导航将突破极

weixin_33597080的博客 354

1、SqlSessionFactoryBean的创建-1

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

zhen_hong的博客 5868

脑机接口(BCI)从原理到开发实战 09|SSVEP应用:通过视觉刺激控制设备

本文介绍了稳态视觉诱发电位(SSVEP)脑机接口技术。SSVEP是一种高效的非侵入式BCI范式,当用户注视特定频率闪烁的视觉刺激时,大脑枕叶会产生对应的节律性响应。文章详细阐述了SSVEP的神经机制、刺激范式设计、数据预处理方法,重点讲解了典型相关分析(CCA)这一核心识别算法。相比运动想象和P300范式,SSVEP具有信息传输率高(60-100 bits/min)、信号稳定、无需训练等优势,在高速拼写、设备控制等领域应用广泛。文章还提供了完整的电极选择、滤波、分段等预处理流程,以及CCA和滤波器组CCA的

小明的博客 1355

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

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

记录知识、锤炼自我 5785

MIPI video mode 和 command mode 的区别

1、何为LCD RAM? LCD 是指字面意思是液晶显示屏(Liquid Crystal Display), 而RAM: 随机存取存储器(Random-Access Memory),两者完全是风马牛不相及的东西。 下图是一个标准的LCD的爆炸图(不含TP),请注意图中红色mark的地方:控制IC-- LCD的大脑。所谓的LCD RAM自然是指此大脑是否包含RAM. 题外话<不感兴趣的...

精诚所至 4690

足球赛事数据API:开发者生存指南(附真实踩坑记录)

作为一个既爱看球又爱写代码的老宅男,我这些年用过的足球API比看过的比赛还多。从最初被各种API文档折磨到怀疑人生,到现在能闭着眼睛调接口,中间的血泪史够写本书了。今天就把这些经验(和教训)分享给各位同好,特别是那些正在为"老板要做个足球App"而秃头的同行们。文档清晰免费层可用响应格式规范API-Sports免费额度大方支持GraphQL有中文文档(难得!Sportmonks数据全面有Webhook支持按需付费。

Happy0970的博客 2194

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

华为手环实时心率数据导出到UWP项目中

hello大家好呀O(∩_∩)O最近在做毕设 其中有个小功能要用到实时心率数据。查找网上的资料发现只有小米手环的实时心率数据导出但是没有华为手环的,我试了华为手环但是并不能行得通哈哈哈。现在分享一下华为手环实时心率数据导出的代码。

apple_63713858的博客 1582

SqlSessionFactory的理解

SqlSessionFactory的理解

m0_65712857的博客 243

Labview调用C++ dll之字符串数组传递

做项目的时候碰到了一个需求,有一个复杂的运算,用labview实现非常的麻烦,但是如果用C++实现,就会灵活很多。尝试着采用Labview调用C++编写的动态链接库方式解决,兼顾Labview的便利和C++的灵活性。 运算好说,主要难点是Labview与C++之间的数据对应关系,因为我最后的结果是既有字符串又有数字,对于单纯的数字来说,直接通过调用数组的方式就能解决,这里主要记录一下字符串数组...

bgbgx的博客 6809

笔记:使用Materials Studio计算聚合物的玻璃化转变温度

使用Materials Studio计算聚合物的玻璃化转变温度。

FXJgogogo的博客 1940

spring-mybatis 之SqlSessionFactoryBean

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

赶路人儿 5万+

企业级OpenClaw部署实战:10个关键配置让你从“养虾“到“精通“

OpenClaw(社区昵称"小龙虾")作为2026年开源社区最活跃的AI Agent项目,凭借其多Agent协同架构和企业级安全隔离能力,已成为中大型企业的首选AI基础设施。本文基于真实企业部署经验,系统梳理了企业级OpenClaw部署的10个关键配置:用户ID消息隔离、群组ID消息隔离、多机器人配置、无限量Agent创建、机器人与Agent关联、Agent间调度、权限配置、Hooks任务、多模型切换及一键备份迁移。

program哲学 931

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

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

A minor 2070

IEM模型,地表粗糙度模拟

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

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Spring整合MyBatis:SqlSessionFactoryBean【基础】

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

mrguif的博客 3102

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

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

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

zzf_forgot的博客 598

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

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

余额充值