今天完成了基础信息的CRUD,但是遇到了一个关于JAVA Spring Boot注入的问题。
问题如下:
Error:(20, 34) Could not autowire. No beans of 'workCenterInfoMapper' type found.
@Autowired
private workCenterInfoMapper workCenterInfoMapper;
我改成:
@Resource
private workCenterInfoMapper workCenterInfoMapper;
就不报错了。
报错原因分析:
当你使用 @Autowired
注解时,Spring会尝试根据类型自动装配所需的bean。如果在Spring的上下文中找不到类型为 workCenterInfoMapper
的bean,就会抛出“Could not autowire”错误。这个问题的根本原因可能包括:
- Bean未注册:
workCenterInfoMapper
接口没有被Spring容器识别为一个bean,通常是因为缺少必要的注解(如@Mapper
或@Repository
)。 - 组件扫描配置问题:Spring的组件扫描可能没有覆盖到包含
workCenterInfoMapper
的包。 - 依赖注入的方式:
@Autowired
是按类型注入,而@Resource
是按名称注入。如果存在多个相同类型的bean,@Autowired
可能会失败,而@Resource
可以通过名称找到特定的bean。
后面搜索原因的时候发现@mapper确实没有注入,是我疏忽大意了。
加上之后果然不报错了。
解决方案:
将注解从 @Autowired
更改为 @Resource
后,问题解决的原因如下:
1. 按名称注入
@Resource
默认按名称进行注入。如果Spring容器中存在名为workCenterInfoMapper
的bean,它会直接找到并注入该bean,而不需要考虑类型匹配的问题。
2. 避免类型冲突
- 如果存在多个同类型的bean,使用
@Autowired
可能会引发冲突,导致无法确定注入哪个bean。而@Resource
通过名称可以明确指定要注入的bean,避免了这种冲突。
3. 更加灵活的配置
@Resource
是Java EE标准注解,具有更好的兼容性和灵活性,适用于需要按名称或类型注入的场景。