IDEA:Could not autowire.

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

使用IDEA开发项目时,经常会看到有些注入的属性下有一条红色波浪线,当把鼠标放上,查看问题时会提示Could not autowire,虽然实际可能不影响程序的运行,但是有时强迫症犯了就想去掉它们,这次我们就针对注入产生的Could not autowire问题进行分析。

1. 问题描述

在使用SpringBoot+MyBatis框架开发项目时,在Service层经常会出现依赖注入时报错,如下情况:

image.png

我们将鼠标放置到报错位置,会提示:

image.png

Could not autowire. No beans of 'ProductCodeMapper' type found,代表没有找到该类型的beans,无法进行自动注入。

2. 问题原因

问题出现的原因就是对应的注入字段找不到,如果不是真的没有对应的类信息,那就是开发框架的兼容问题。

当此问题出现在Service层引用Mapper文件时,这是由于Mapper文件使用的@Mapper注解是由MyBatis提供的,而自动注入的@Autowired注解是Spring提供的。

IDEA可以轻松的理解Spring上下文,但是对于MyBatis框架不能很好的关联,因此MyBatis中@Mapper注解标注的对象虽然存在,但是在IDEA中Spring却不能够发现。

并且,Spring的@Autowired注解默认要求注入的对象必须存在,IDEA检测不到对象时就会报错,设置为false可以关闭检测。

@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {
    /**
     * Declares whether the annotated dependency is required.
     * <p>Defaults to {@code true}.
     */
    boolean required() default true;
}
复制代码

3. 问题解决方法

其实针对这个问题,只是IDEA给的红色警告,不影响程序的正常执行,但是如果看着不舒服,想要解决掉,那么我们就可以从问题出现的原因出发,想办法来解决掉它。

  1. 既然是IDEA的红色警告,那么我们就可以将IDEA的警告提示关闭,或者将警告级别调低,则不会出现该提醒了
  2. Spring的@Autowired注解默认要求注入的对象必须存在,我们可以手动设置为false,即不去检查注入对象是否存在,设置后IDEA不再报警
  3. @Autowired注解替换为@Resource注解也会不再报错,因为@Resource注解是由J2ee提供的,而@Autowired注解是Spring提供的。
  4. 在Mapper接口上加@Component注解,表示当前Mapper注入到Spring容器中,这样IDEA就可以将它们关联,不再报错
  5. 更改为其他注入方式,如使用构造器注入,Spring4.x版本推荐使用构造器注入
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
//@AllArgsConstructor
public class ChargeServiceImpl implements ChargeService {

    private final RedisTemplate<String, Object> redisTemplate;
    private final CarUserMapper carUserMapper;
    private final ChargingMapper chargingMapper;
}
复制代码

猜你喜欢

转载自juejin.im/post/7018196894882988045