- 问题解析
在 Spring 整合 Mybatis 时,我们通常会使用注解的方式配置 Mybatis。在扫描 mapper 接口和 mapper.xml 文件时,我们需要在配置文件中添加以下两行配置:
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.example.mapper" />
</bean>
其中 basePackage
属性指定了需要扫描的包路径。然而,在具体操作时,我们可能会遇到如下的报错信息:
org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [com.example.config.ApplicationConfig]; nested exception is org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'fooMapper' for bean class [com.example.mapper.FooMapper] conflicts with existing, non-compatible bean definition of same name and class [org.mybatis.spring.mapper.MapperFactoryBean]
这是因为在 Spring 容器中已经存在名字为 fooMapper
的 Bean,而 Mybatis 也会扫描同样的 Mapper 接口并创建同样名字的 Bean,两者冲突导致报错。这时,我们需要进行解决。
-
解决方案
-
显式指定 Mybatis 创建的 Bean 的名称
我们可以在 mapper.xml 文件中定义 <mapper namespace>
标签,用于显式指定 Mybatis 创建的 Bean 的名称,例如:
<mapper namespace="com.example.mapper.FooMapper">
<!-- mapper operation -->
</mapper>
这样,Mybatis 就会根据 <mapper namespace>
中指定的名称来创建 Bean,不会因为与 Spring 中已有的 Bean 冲突而报错。
- 使用
@Qualifier
注解指定 Bean
如果我们无法修改 mapper.xml 文件,或者不希望显式指定 Bean 的名称,我们可以在代码中使用 @Qualifier
注解来指定需要注入的 Bean,例如:
@Autowired
@Qualifier("fooMapperOld")
private FooMapper fooMapper;
这样,Spring 就会根据 @Qualifier
中指定的名称来注入 Bean,不会因为与 Mybatis 中已有的 Bean 冲突而报错。
- 总结
在使用 Spring 整合 Mybatis 时,我们需要注意避免与 Mybatis 中已有的 Bean 冲突,可以通过显式指定 Bean 名称或使用 @Qualifier
注解来解决。对于具体情况,我们需要结合实际操作来进行判断和选择。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring整合Mybatis 扫描注解创建Bean报错的解决方案 - Python技术站