当我整合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文件中,我将bean sqlSessionFactory
与类org.mybatis.spring.SqlSessionFactoryBean
相关联,为什么错误输出告诉我另一个非相对类名{{1 }}?
非常感谢!
答案 0 :(得分:1)
通过依赖注入访问SqlSessionFactoryBean
是没有意义的,通常我们使用Factory Beans创建的对象,而不是Factory Beans本身,在这种情况下,Factory Bean返回DefaultSqlSessionFactory
实例。
请参阅Customizing instantiation logic with the FactoryBean Interface
但是,如果您确实想要访问FactoryBean
个实例,则应使用符号符号&
,请参阅Spring: Getting FactoryBean object instead of FactoryBean.getObject()
是的,返回工厂的工厂豆的概念可能有点令人困惑,但这就是春天的工作方式。
所以可能SqlSessionFactory
而不是SqlSessionFactoryFactoryBean
就是你想要的。
更新:实际上MyBatis甚至在SqlSessionFactoryBean
的文档中对此进行了解释请注意,SqlSessionFactoryBean实现了Spring的FactoryBean 接口(参见Spring文档的3.8节)。这意味着 bean最终创造的bean不是 SqlSessionFactoryBean本身,但工厂返回的结果 在工厂上调用getObject()。在这种情况下,春天会 在应用程序启动时为您构建一个SqlSessionFactory并存储它 名称为sqlSessionFactory