spring整合 mybatis时 SqlSessionFactoryBean的一个小报错:Bean named ‘sqlSessionFactory‘ is expected to be of ty

简介: spring整合 mybatis时 SqlSessionFactoryBean的一个小报错:Bean named ‘sqlSessionFactory‘ is expected to be of ty

标题盛不下了,把报错写到这

Bean named 'sqlSessionFactory' is expected to be of type 'org.mybatis.spring.SqlSessionFactoryBean' but was actually of type 'org.apache.ibatis.session.defaults.DefaultSqlSessionFactory'

代码背景

只是在做spring整合mybatis 的练习的时候出现的一个报错,技术版本


spiring: 5.3.1

mybatis: 3.5.3

mybatis-spring(sping整合mybtis的jar): 2.0.6

aspectjweaver: 1.9.4

junit: 4.13.1

c3p0: 0.9.5.5

核心代码如下:

applicationContext.xml

<!-- 加载配置文件 -->
<context:property-placeholder location="jdbcConfig.properties"/>
<!-- 配置数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="driverClass" value="${jdbc.driver}"/>
    <property name="jdbcUrl" value="${jdbc.url}"/>
    <property name="user" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
</bean>
<!-- 配置 Mybatis 的 Session 工厂 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <!-- 数据库连接池 -->
    <property name="dataSource" ref="dataSource"/>
    <!-- 文件映射器 -->
    <property name="configLocation" value="classpath:mybatis-config.xml"/>
    <!-- 自动扫描 mapper.xml 文件 -->
    <property name="mapperLocations" value="classpath:com/krlin/mybatis/dao/*.xml"/>
</bean>

按照spring 的理解,这样就是在 spring 的 IOC 容器中 存了两个JAVA对象,一个是存放数据库配置数据的 dataSource ,一个是 mybatis 的 核心对象 sqlSessionFactory


按照常理,放在IOC 容器中的对象可以获取并使用,于是测试类中:

@Test
public void dataSourceTest() {
    /** 使用 ApplicationContext 接口, 获取 spring 容器 */
    ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
    /** 根据 bean 的 id 获取对象 */
    ComboPooledDataSource dataSource = ac.getBean("dataSource", ComboPooledDataSource.class);
    System.out.println(dataSource.getJdbcUrl());
    System.out.println(dataSource.getUser());
    System.out.println(dataSource.getPassword());
}
@Test
public void SqlSessionFactoryTest() {
    ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
    SqlSessionFactoryBean sqlSessionFactory = ac.getBean("sqlSessionFactory", SqlSessionFactoryBean.class);
    System.out.println(sqlSessionFactory);

代码分析

第一个 dataSource 的测试没有问题,第二个就报错了 Bean named 'sqlSessionFactory' is expected to be of type 'org.mybatis.spring.SqlSessionFactoryBean' but was actually of type 'org.apache.ibatis.session.defaults.DefaultSqlSessionFactory'

翻译一下也很简单, sqlSessionFactory 应该是 org.mybatis.spring.SqlSessionFactoryBean类型的,但是实际上却是 org.apache.ibatis.session.defaults.DefaultSqlSessionFactory 类型的。


心想不对啊,我在配置文件中提供的类就是 SqlSessionFactoryBean 没错啊,怎么会出现一个其他的类,进入 SqlSessionfactoryBean 发现

他实现了 FactoryBean<T> 接口,原来是当实现了这个接口的 Bean 放到 IOC容器的时候,那么容器中实际存放的其实就是 这个泛型T 的类型,这也就不难理解,我们需要的 SqlSessionFactory 是 SqlSessionFactoryBean 来提供的,因为 SqlSessionFactoryBean 实现的接口的泛型就是 sqlSessionFactory, 所以看似我们 放置了 SqlSessionFactoryBean, 但实际上在 IOC 中是一个 SqlSessionFactory罢了。


查看SqlSessionFactory 发现他是一个接口

他有两个实现类,而第一个实现类,就是放入到 IOC 里边的类型,所以我们在测试的时候,就会出现类型不匹配了。


解决办法也很简单,我们在测试类中,用 DefaultSqlSessionFactory 来接收就行了

@Test
public void SqlSessionFactoryTest() {
    ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
    DefaultSqlSessionFactory sqlSessionFactory = ac.getBean("sqlSessionFactory", DefaultSqlSessionFactory.class);
    SysUserMapper mapper = sqlSessionFactory.openSession(true).getMapper(SysUserMapper.class);
    List<SysUserEntity> userList = mapper.getUserList();
    userList.forEach(System.out::println);
}

打印数据也没有问题(虽然我们平时也不这么用,但是逻辑上是可以同的)

代码本身没问题,就是自己的理解没有到位,没有看透 SqlSessionFactoryBean 背后的本质。

相关文章
|
21天前
|
缓存 安全 Java
Spring框架中Bean是如何加载的?从底层源码入手,详细解读Bean的创建流程
从底层源码入手,通过代码示例,追踪AnnotationConfigApplicationContext加载配置类、启动Spring容器的整个流程,并对IOC、BeanDefinition、PostProcesser等相关概念进行解释
Spring框架中Bean是如何加载的?从底层源码入手,详细解读Bean的创建流程
|
8天前
|
Java 数据库连接 数据库
spring复习05,spring整合mybatis,声明式事务
这篇文章详细介绍了如何在Spring框架中整合MyBatis以及如何配置声明式事务。主要内容包括:在Maven项目中添加依赖、创建实体类和Mapper接口、配置MyBatis核心配置文件和映射文件、配置数据源、创建sqlSessionFactory和sqlSessionTemplate、实现Mapper接口、配置声明式事务以及测试使用。此外,还解释了声明式事务的传播行为、隔离级别、只读提示和事务超时期间等概念。
spring复习05,spring整合mybatis,声明式事务
|
20天前
|
XML Java 数据格式
Spring IOC—基于XML配置Bean的更多内容和细节(通俗易懂)
Spring 第二节内容补充 关于Bean配置的更多内容和细节 万字详解!
118 18
Spring IOC—基于XML配置Bean的更多内容和细节(通俗易懂)
|
8天前
|
XML Java 数据格式
spring复习02,xml配置管理bean
详细讲解了Spring框架中基于XML配置文件管理bean的各种方式,包括获取bean、依赖注入、特殊值处理、属性赋值、集合类型处理、p命名空间、bean作用域及生命周期和自动装配。
spring复习02,xml配置管理bean
|
11天前
|
Java 数据库连接 数据库
SpringBoot 整合jdbc和mybatis
本文详细介绍了如何在SpringBoot项目中整合JDBC与MyBatis,并提供了具体的配置步骤和示例代码。首先,通过创建用户实体类和数据库表来准备基础环境;接着,配置Maven依赖、数据库连接及属性;最后,分别展示了JDBC与MyBatis的集成方法及其基本操作,包括增删查改等功能的实现。适合初学者快速入门。
SpringBoot 整合jdbc和mybatis
|
8天前
|
XML Java 关系型数据库
springboot 集成 mybatis-plus 代码生成器
本文介绍了如何在Spring Boot项目中集成MyBatis-Plus代码生成器,包括导入相关依赖坐标、配置快速代码生成器以及自定义代码生成器模板的步骤和代码示例,旨在提高开发效率,快速生成Entity、Mapper、Mapper XML、Service、Controller等代码。
springboot 集成 mybatis-plus 代码生成器
|
8天前
|
SQL XML Java
springboot整合mybatis-plus及mybatis-plus分页插件的使用
这篇文章介绍了如何在Spring Boot项目中整合MyBatis-Plus及其分页插件,包括依赖引入、配置文件编写、SQL表创建、Mapper层、Service层、Controller层的创建,以及分页插件的使用和数据展示HTML页面的编写。
springboot整合mybatis-plus及mybatis-plus分页插件的使用
|
8天前
|
XML Java 数据库连接
springboot中整合mybatis及简单使用
这篇文章介绍了如何在Spring Boot项目中整合MyBatis,包括依赖引入、配置数据源、创建测试表、编写Mapper接口和XML文件、以及创建Service和Controller层的步骤。
springboot中整合mybatis及简单使用
|
8天前
|
XML Java 数据格式
spring复习03,注解配置管理bean
Spring框架中使用注解配置管理bean的方法,包括常用注解的标识组件、扫描组件、基于注解的自动装配以及使用注解后的注意事项,并提供了一个基于注解自动装配的完整示例。
spring复习03,注解配置管理bean
|
21天前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
下一篇
无影云桌面