0

我在整合spring和mybatis的时候遇到了错误输出,说的是:

名为 'sqlSessionFactory' 的 Bean 必须是 [org.mybatis.spring.SqlSessionFactoryBean] 类型,但实际上是 [org.apache.ibatis.session.defaults.DefaultSqlSessionFactory] ​​类型

这是我的代码片段:

ApplicationContext context = new ClassPathXmlApplicationContext("spring_mybatis_integration/spring_config.xml");
    SqlSessionFactoryBean sqlSessionFactoryBean = context.getBean("sqlSessionFactory", org.mybatis.spring.SqlSessionFactoryBean.class);

这是我在 xml 中的 bean 定义:

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  <property name="configLocation" value="spring_mybatis_integration/mybatis_config.xml"></property>
  <property name="dataSource" ref="dataSource"></property>
</bean>

如您所见,在 java 代码和 xml 文件中,我将 beansqlSessionFactory与 class相关联org.mybatis.spring.SqlSessionFactoryBean,为什么错误输出告诉我另一个非相对类名org.apache.ibatis.session.defaults.DefaultSqlSessionFactory

非常感谢!

版本信息:

  • mybatis 3.1.1
  • 春天 3.2.0
  • mybatis-spring 1.1.1
4

1 回答 1

1

没有必要SqlSessionFactoryBean通过依赖注入进行访问,通常我们使用由工厂 Bean 创建的对象,而不是工厂 Bean 本身,在这种情况下,工厂 Bean 返回一个DefaultSqlSessionFactory实例。

请参阅使用 FactoryBean 接口自定义实例化逻辑

但是如果你真的想访问FactoryBean实例,你应该使用 & 符号&参见Spring: Getting FactoryBean object 而不是 FactoryBean.getObject()

是的,返回工厂的工厂 Bean 的概念可能有点令人困惑,但这就是 Spring 中的工作方式。

所以它很可能SqlSessionFactory不是SqlSessionFactoryFactoryBean你想要的。

更新:实际上 MyBatis 甚至在SqlSessionFactoryBean的文档中解释了这一点

请注意,SqlSessionFactoryBean 实现了 Spring 的 FactoryBean 接口(参见 Spring 文档的第 3.8 节)。这意味着 Spring 最终创建的 bean 不是 SqlSessionFactoryBean 本身,而是工厂作为对工厂的 getObject() 调用的结果返回的内容。在这种情况下,Spring 将在应用程序启动时为您构建一个 SqlSessionFactory 并将其存储为名称 sqlSessionFactory

于 2013-01-27T09:04:48.423 回答