IDEA提示找不到Mapper接口:Could not autowire.No beans of 'xxxMapper' type found


前言

相信大多數互聯網公司的持久層框架都是使用 Mybatis 框架,而大家在 Service 層引入自己編寫的 Mapper 接口時應該會遇到下面的情況:
在這里插入圖片描述
我們可以看到,上面的紅色警告在提示我們,找不到 xxxMaper 這個類型的 bean。

為啥呢?

因為 @Mapper 這個注解是 Mybatis 提供的,而 @Autowried 注解是 Spring 提供的,IDEA能理解 Spring 的上下文,但是卻和 Mybatis 關聯不上。而且我們可以根據 @Autowried 源碼看到,默認情況下,@Autowried 要求依賴對象必須存在,那么此時 IDEA 只能給個紅色警告了。

@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;

}

怎么解決?

雖然 IDEA 給了個紅色警告,但是程序本身是沒問題的,可以正常運行。可是代碼里頭有紅色警告是相當的顯眼的,不曉得情況的人還以為我么你的代碼有問題呢?

下面我將會列出實踐過的解決方案。
1、簡單粗暴

直接關掉IDEA的警告提示,是不是很簡單?是不是很粗暴?

2、麻煩粗暴,給@Autowried注解設置required=false
@Autowired(required = false)
private CarUserMapper carUserMapper;

這樣就不會警告了。因為此時 @Autowried 不會再去校驗 Mapper 接口是否為空。
缺點:每引入一個Mapper接口都需要設置上required=false,相當的麻煩,而且容易給別人造成誤解:這個Mapper接口真的不需一定存在。

3、@Autowried替換為@Resource
@Resource
private CarUserMapper carUserMapper;

此時也不會給紅色警告了。@Resource 注解是 J2EE 提供的,而 @Autowried 注解是 Spring 提供的,他們如果感興趣可以去看一下他們的區別。

4、在Mapper接口上加@Component
@Mapper
@Component
public inteface CarUserMapper{}

加這個注解呢,主要是為了讓欺騙IEDA,讓它以為CarUserMapper也是一個Spring管理的Bean,這樣子使用@Autowired注解注入也不會報錯了。

5、使用構造函數注入(Spring4.x推薦)

相信大家都有使用Lombok這個神器了,我們可以利用他的注解@RequiredArgsConstructor來直接構建構造函數即可,不過我嘗試過單單使用@AllArgsConstructor也是沒問題的。
當然了,大家如果注入的依賴比較少或者閑得蛋疼,還是可以自己來寫構造函數的。

@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
//@AllArgsConstructor
public class ChargeServiceImpl implements ChargeService {

    private final RedisTemplate<String, Object> redisTemplate;
    private final CarUserMapper carUserMapper;
    private final ChargingMapper chargingMapper;
}

為什么Spring4.x之后就推薦使用構造函數注入呢?大家可以看看一篇文章:
Why field injection is evil
簡單點總結一下就是:可以使依賴不可變、實例化時,會檢查構造函數的參數是否為空、方便單元測試等等。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM