相信大多數互聯網公司的持久層框架都是使用 Mybatis 框架,而你們在 Service 層引入本身編寫的 Mapper 接口時應該會遇到下面的狀況:
咱們能夠看到,上面的紅色警告在提示咱們,找不到 xxxMaper 這個類型的 bean。java
由於 @Mapper 這個註解是 Mybatis 提供的,而 @Autowried 註解是 Spring 提供的,IDEA能理解 Spring 的上下文,可是卻和 Mybatis 關聯不上。並且咱們能夠根據 @Autowried 源碼看到,默認狀況下,@Autowried 要求依賴對象必須存在,那麼此時 IDEA 只能給個紅色警告了。redis
@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 給了個紅色警告,可是程序自己是沒問題的,能夠正常運行。但是代碼裏頭有紅色警告是至關的顯眼的,不曉得狀況的人還覺得我麼你的代碼有問題呢?spring
直接關掉IDEA的警告提示,是否是很簡單?是否是很粗暴?app
@Autowired(required = false) private CarUserMapper carUserMapper;
這樣就不會警告了。由於此時 @Autowried 不會再去校驗 Mapper 接口是否爲空。
缺點:每引入一個Mapper接口都須要設置上required=false,至關的麻煩,並且容易給別人形成誤解:這個Mapper接口真的不需必定存在。框架
@Resource private CarUserMapper carUserMapper;
此時也不會給紅色警告了。@Resource 註解是 J2EE 提供的,而 @Autowried 註解是 Spring 提供的,他們若是感興趣能夠去看一下他們的區別。函數
@Mapper @Component public inteface CarUserMapper{}
加這個註解呢,主要是爲了讓欺騙IEDA,讓它覺得CarUserMapper也是一個Spring管理的Bean,這樣子使用@Autowired註解注入也不會報錯了。單元測試
相信你們都有使用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
簡單點總結一下就是:可使依賴不可變、實例化時,會檢查構造函數的參數是否爲空、方便單元測試等等。ui