【问题标题】:"Bean named XXX must be of type[XXX], but was actually of type[XXX]"“名为 XXX 的 Bean 必须属于 [XXX] 类型,但实际上属于 [XXX] 类型”
【发布时间】:2013-01-10 20:05:55
【问题描述】:

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

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

这是我的代码 sn-p:

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 文件中,我将 bean sqlSessionFactory 与类 org.mybatis.spring.SqlSessionFactoryBean 相关联,为什么错误输出告诉我另一个非相对类名 org.apache.ibatis.session.defaults.DefaultSqlSessionFactory

非常感谢!

版本信息:

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

【问题讨论】:

  • 在启动 ApplicationContext 并查看 bean 定义覆盖日志时启用 springframework 日志记录。

标签: spring integration mybatis


【解决方案1】:

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

Customizing instantiation logic with the FactoryBean Interface

但如果你真的想访问FactoryBean 实例,你应该使用与符号&amp;Spring: Getting FactoryBean object instead of FactoryBean.getObject()

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

所以你想要的是SqlSessionFactory 而不是SqlSessionFactoryFactoryBean

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

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

【讨论】:

  • thx!我最想要的确实是sqlSessionFactory而不是SqlSessionFactoryFactoryBean。我是mybatis和spring集成的初学者,在Spring xml文件中定义一个MapperFactoryBean后,我应该怎么做才能得到一个Mapper接口(它绑定到我可以调用方法的实现)?
  • 附言。我检索 sqlSessionFactory 的动机是获取绑定到 mapper.xml 的映射器接口(DAO),有没有更体面的方法来做到这一点?谢谢~
  • @Judking,我不是 mybatis 用户,但您不应该手动从应用程序容器中检索 SqlSessionFactory 实例 - 您应该创建专用类(服务、DAOS)并通过 Spring(它是 Spring 容器,它设置其属性值并为自动装配提供构造函数参数),例如查看官方文档 mybatis.org/spring/mappers.html 中假设的 FooServiceImpl 类是如何完成的 - 在 XML 中声明了一个 MapperFactoryBean 和它创建的映射器被注入到 FooServiceImpl 实例中。
  • 我明白了,MapperFactoryBean 就像 DAO 接口的代理一样。但是 spring 如何在用户不必编写任何 java 代码的情况下为用户完成所有这些工作呢?春天做所有这些事情的起点在哪里?感谢您的时间朋友link:程序生命周期中spring xml的机制是什么?
  • Spring 容器配置是一组称为 Bean 定义的实体。当您提供一个 xml 文件时,XmlBeanDefinitionReader 阅读器会解析它并填充容器的 bean 定义注册表。 Bean 定义包含用于创建类的信息——例如完全限定的类名和参数。它们还定义了 bean 的生命周期。知道类名就足以通过 java 中的反射 API 创建它。
猜你喜欢
  • 2016-03-25
  • 2017-01-22
  • 2020-05-08
  • 1970-01-01
  • 2018-12-24
  • 2019-03-07
相关资源
最近更新 更多