项目采用的技术选型
- 前端
- Vue框架
- 后端
- SpringBoot
- MyBatis
- MyBatis-Plus
- MySQL
问题描述
点击登录之后控制台就报错了,提示MyBatis 无法找到名为 userLogin 的绑定语句。但是我使用的是SpringMVC框架的三层架构模式(Controller + Service + Mapper)。我也检查了是否将它们装配为Bean。
通过 DeBug 发现在代码走到 Service 就直接报错了。我当时就懵了,从来没遇到过这种问题,后来调试发现装配的 UserService Bean 根本不是自己写的那个类,因为我的业务层并没有继承 MyBatis-Plus 提供的 iService
@Resource 注解回顾
首先,复习一下 @Resource 注解加载 Bean 的方式
1. 按名称自动装配(Name-based Autowiring)
默认情况下,@Resource 注解按照名称进行自动装配。当你在一个字段上使用 @Resource 且不指定任何属性时,Spring 会尝试找到一个与字段名称相同的 Bean 进行注入。如果你想按名称注入,也可以明确指定 name 属性:
@Resource(name="myBean")
private MyBean myBean;
2. 按类型自动装配(Type-based Autowiring)
如果没有找到匹配的 Bean 名称,Spring 会退回到按类型自动装配。它会尝试找到一个与字段类型匹配的唯一 Bean。如果存在多个类型匹配的 Bean,Spring 将抛出异常,除非使用 name 属性指定了具体的 Bean。
解决思路
到这里我就能锁定是由于没有指定加载 Bean 的名称导致加载到了 MyBatis-Plus 框架的某个 Bean 引发的问题。于是,修改了代码。
@Service("myUserService")
public class UserServiceImpl implements UserService {
@Resource(name = "myUserService")
UserService userService;
到这里,问题就解决了。