相信大多数互联网公司的持久层框架都是使用 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