MapperScannerConfigurer之sqlSessionFactoryBeanName注入方式
Spring整合Mybatis时,项目启动时报错:(MapperScannerConfigurer之sqlSessionFactoryBeanName注入方式)
pringframework.beans.factory.BeanCreationException: Error creating bean with name 'mapperScannerConfigurer'defined in class path resource [applicationContext.xml]:
Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sqlSessionFactory';
nested exception is org.springframework.beans.factory BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [applicationContext.xml]:
Cannot resolve reference to bean
'dataSource' while setting bean property 'dataSource';
nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [applicationContext.xml]: Error setting property values;
nested exception is org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are: PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'driverClassName' threw exception;
nested exception is java.lang.IllegalStateException: Could not load JDBC driver class [${driver}]
可以看到报的大大小小错误共有5个错误:
pringframework.beans.factory.BeanCreationException:创建名为“mapperScannerConfigurer”的bean时出错,该bean在类路径资源[applicationContext.xml]中定义:
设置bean属性“sqlSessionFactory”时无法解析对bean“sessionFactory”的引用;
嵌套异常为org.springframework.beans.factory BeanCreationException:创建名为“sessionFactory”的bean时出错,该bean在类路径资源[applicationContext.xml]中定义:
无法解析对bean的引用
设置bean属性“dataSource”时使用“dataSource”;
嵌套异常为org.springframework.beans.factory.BeanCreationException:创建名为“dataSource”的bean时出错,该bean在类路径资源[applicationContext.xml]中定义:设置属性值时出错;
嵌套的异常是org.springframework.beans.PropertyBatchUpdateException;嵌套的PropertyAccessException(1)是:PropertyAccessException 1:org.springframework.beans.MethodInvocationException:Property'driverClassName'抛出异常;
嵌套异常为java.lang.IllegalStateException:无法加载JDBC驱动程序类[${driver}]
ok,那么下面是我的Spring配置文件的源代码
<context:property-placeholder location="classpath:/jdbc.properties"/>
<!-- 配置数据源bean -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="password" value="${password}"/>
<property name="username" value="${user}"/>
</bean>
<!-- SqlSessionFactory的bean -->
<bean name="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 扫描Mapper文件 -->
<bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactory" ref="sessionFactory"/>
<property name="basePackage" value="com.lyl.mapper"/>
</bean>
通过分析日志提供的报错信息,发现跟本的原因时因为程序没有加载JDBC的驱动,也就是数据源bean中的driverClassName
没有加载成功,因为我这里采用的是jdbc.properties
的方式来加载数据源参数信息,所有我一开是怀疑的是文件的驱动路径写错了或者jdbc的包没有导入环境中,但是折腾后面发现一切正常,于是索性的将${driver}
直接替换成文件中的参数,引入改成手写,启动项目,竟然发现启动成功!,这让我百思不得其解,于是开始漫长的百度,找不到我想要的答案,便再看一遍日志,发现是因为配置sqlSessionFactory
bean时,dataSource
出错找不到JDBC驱动,既然JDBC驱动没有毛病,sqlSessionFactory
也不可能出毛病,于是我就将目光锁定到了mapperScannerConfigurer
bean,因为他注入了没有毛病的SQL Session Factory
,然后就是开始百度,果然,找对了错误答案一下就出来了。
原来的mapperScannerConfigurer
bean:
<!-- 扫描Mapper文件 -->
<bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactory" ref="sessionFactory"/>
<property name="basePackage" value="com.lyl.mapper"/>
</bean>
修改后的mapperScannerConfigurer
bean:
<bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="sessionFactory"/>
<!-- <property name="sqlSessionFactory" ref="sessionFactory"/>-->
<property name="basePackage" value="com.lyl.mapper"/>
</bean>
可以发现,不再注入sqlSessionFactory
的属性,取而代之的是sqlSessionFactoryBeanName
属性,并且用的是value来赋值,程序能够正常run。
那么问题是解决了,原理是什么呢?我又百度了sqlSessionFactoryBeanName
这的个属性。
发现在MapperScannerConfigurer
中有4种注入方式,而sqlSessionFactory
的注入方式已经过时了,而造成本次报错的根本原因出现在MapperScannerConfigurer
上:
在mybatis-spring1.1.0之前,是经过将SqlSessionFactory对象注入到sqlSessionFactory,这样作可能会有一个问题,就是在初始化MyBatis时,jdbc.properties文件还没被加载进来,dataSource的属性值没有被替换,就开始构造sqlSessionFactory类,属性值就会加载失败。在1.1.0之后,MapperScannerConfigure提供了String类型的sqlSessionFactoryBeanName,这样将bean name注入到sqlSessionFactoryBeanName,这样就会等到spring初始化完成后,再构建sqlSessionFactory。
终于找到了错误本质了,折腾了大半天!发现原来是jdbc.properties
文件和SqlSessionFactory
出现了冲突,在MapperScannerConfigurer
中直接注入sqlSessionFactory
属性,如果使用的是占位符去配置dataSource
bean,那么可能会造成sqlSessionFactory
构建先于jdbc.properties
文件的加载。
目前还没有找到用sqlSessionFactory
来注入成功的解决方法(除非直接写jdbc的值不用占位符形式),既然都过时了那就不用了吧。
MapperScannerConfigurer之sqlSessionFactoryBeanName注入方式的更多相关文章
- spring四种依赖注入方式
一.Set注入 这是最简单的注入方式,假设有一个SpringAction,类中需要实例化一个SpringDao对象,那么就可以定义一个private的SpringDao成员变量,然后创建SpringD ...
- Spring的三种通过XML实现DataSource注入方式
Spring的三种通过XML实现DataSource注入方式: 1.使用Spring自带的DriverManagerDataSource 2.使用DBCP连接池 3.使用Tomcat提供的JNDI
- spring笔记--依赖注入之针对不同类型变量的几种注入方式
控制反转和依赖注入讲的都是一个概念,只不过是站在了不同的角度,所谓的依赖注入: 是指在运行期,由外部容器动态地将依赖对象注入到组件中.当spring容器启动后,spring容器初始化,创建并管理bea ...
- 控制反转IOC的依赖注入方式
引言: 项目中遇到关于IOC的一些内容,因为和正常的逻辑代码比较起来,IOC有点反常.因此本文记录IOC的一些基础知识,并附有相应的简单实例,而在实际项目中再复杂的应用也只是在基本应用的基础上扩展而来 ...
- spring ioc三种注入方式
spring ioc三种注入方式 IOC ,全称 (Inverse Of Control) ,中文意思为:控制反转 什么是控制反转? 控制反转是一种将组件依赖关系的创建和管理置于程序外部的技术. 由容 ...
- spring 学习之 bean 的注入方式 property和constructor-arg的使用方式
spring 学习之 bean 的注入方式 property和constructor-arg的使用方式. bean的注入方式: property 注入是: 通过setxx方法注入. construct ...
- Spring IOC 注入方式
依赖注入通常有如下两种方式: ①设值注入:IOC容器使用属性的Setter方法来注入被依赖的实例. 设值注入是指IOC容器使用属性的Setter方法来注入被依赖的实例.这种注入方式简单.直观,因而在S ...
- Spring 3种注入方式
spring的三种注入方式: 接口注入(不推荐) getter,setter方式注入(比较常用) 构造器注入(死的应用) 关于getter和setter方式的注入: autowire="de ...
- Spring 依赖注入方式详解
平常的Java开发中,程序员在某个类中需要依赖其它类的方法. 通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理. Spring提出了依赖注入的思想,即依赖类不由 ...
随机推荐
- css伪类(:before和:after)
:before和:after的作用就是在指定的元素内容(而不是元素本身)之前或者之后插入一个包含content属性指定内容的行内元素,最基本的用法如下: #example{ width:300p ...
- 6轮面试辛苦拿到阿里Android开发offer,却从22k降到15k,在逗我?
一小伙工作快3年了,拿到了阿里云Android开发岗位P6的offer,算HR面一起,加起来有6轮面试了,将近3个月的时间,1轮同级 + 1轮Android用人部门leader + 1轮Android ...
- 【剑指offer】65. 不用加减乘除做加法
剑指 Offer 65. 不用加减乘除做加法 知识点:数学:位运算 题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用 "+"."-"."* ...
- Docker命令图
attach #当前shell下 attach连接指定运行镜像 build #通过DockerFile 定制镜像 commit #提交当前容器为新的镜像 cp #从容器中拷贝指定文件或者目录到宿主机中 ...
- PrismWPF网盘
技术点 文件分片上传与下载 Vue 正在努力中.... 客户端 采用 WPF:Net5+Prism8+RestSharp 客户端基本结构如下 模块说明 Model: 主要放置Prism模块 ZFile ...
- ☕【Java技术指南】「并发原理专题」AQS的技术体系之CLH、MCS锁的原理及实现
背景 SMP(Symmetric Multi-Processor) 对称多处理器结构,它是相对非对称多处理技术而言的.应用十分广泛的并行技术. 在这种架构中,一台计算机由多个CPU组成,并共享内存和其 ...
- 解决docker删除加载失败的镜像报错
背景: 准备在vulhub复现weblogic反序列化漏洞时报错,环境加载失败准备删除weblogic镜像时报错: unable to delete 7d35c6cd3bcd (must be for ...
- MeteoInfo-Java解析与绘图教程(三)
MeteoInfo-Java解析与绘图教程(三) 上文我们说到简单绘制色斑图(卫星云图),但那种效果可定不符合要求,一般来说,客户需要的是在地图上色斑图的叠加,或者是将图片导出分别是这两种效果 当然还 ...
- SpringSession(redis)
pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...
- C#基础知识---动态为类型添加属性
一.概述 通常情况下,我们是事先在类型中定义好属性的,但有时候,我们需要动态为一个类型添加某些属性,这个时候,我们就需要使用DynamicObject类型了. 二.Demo using System; ...