已解决:IDEA中@Autowired⾃动注⼊MyBatisMapper报红警告的⼏种解决⽅法
今天在使⽤ IDEA 使⽤ MyBatis 的时候遇到了这种情况:
可以看到userMapper 下有个红⾊的波浪警告,虽然代码没有任何问题,能正常运⾏,但是这个红⾊警告在这⾥杵着确实让⼈很窝⼼。
于是我在⽹上了,最终明⽩了原因所在:
因为IDEA可以智能的理解上下⽂,然⽽UserMapper这个接⼝是MyBatis的IDEA理解不了。
⽽@Autowired注解,默认情况下要求依赖对象(也就是userMapper )必须存在。⽽IDEA认为这个对象的实例/代理是个null,所以就友好地给个提⽰。
然后最终的解决⽅案总结了⼏个,按需使⽤把:
⽅法1:为@Autowired 注解设置required = false
使⽤@Autowired 注解时,若希望允许null 值,可设置required = false,像这样:
1 @Autowired(required = false)
2private UserMapper userMapper;
这样就不会有警告了。原因很好理解:IDEA认为userMapper 是个null ,给了警告;加上required = fal
se 后,使
⽤ @Autowired 注解不再去校验userMapper是否存在了。也就不会有警告了。
总结:
这种⽅式有点蛋疼。⼀个庞⼤的既有项⽬,可能到处都在引⽤Mapper,总不能到处都补上required = false吧……⽽且对于新⼿/新员⼯,很难⼀眼看懂加required = false属性只是为了解决IDEA的警告。
⽅法2:使⽤@Resource替换@Autowired
像这样:
@Resource
private UserMapper userMapper;
这样也不会再有讨厌的警告。如果你对原因感兴趣,不妨了解⼀下。
总结:
这种⽅式挺赞,但如果⼀个项⽬已经⼤量使⽤@Autowired ,然后为了个警告到处改成 @Resource,也有点蛋疼。
⽅法3:在Mapper接⼝上添加@Repository注解
@Repository
public interface UserMapper extends Mapper<User> {
}
这样能让你的
resource和autowired注解的区别@Autowired
private UserMapper userMapper;
不再报红。
当然,如果你⽤@Component替换@Repository也是可以的。原理⼤致:IDEA不是认为userMapper 是个 null 嘛…加个@Repository注解骗⼀下IDEA就OK了……
总结:
这种⽅式⽐较赞,改动⼩,也简单,我⽐较喜欢。
⽅法4:⽤Lombok
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class TestService {
private final UserMapper userMapper;
...
}
但如果⾃⼰⼿写成Lombok⽣成的代码,IDEA依然会给你报警告。我猜,应该是IDEA的Lombok插件把IDEA搞懵逼了…所以不提⽰了…
总结:这是我⽬前最喜欢的⽅式。原因有2:
Spring官⽅并不建议直接在类的field上使⽤@Autowired注解,原因详见:,⽤本⽅法可将field注⼊编程构造⽅法注⼊,Spring是⽐较推荐的。
体现了Lombok的优势,简化了你的代码。⽽且你也不⽤在每个field 上都加上@Autowired注解了。
不过这种⽅式也有缺点:那就是如果你类之间的依赖关系⽐较复杂,特别是存在循环依赖(A引⽤B,B引⽤A,或者间接的循环引⽤)时,应⽤将会启动不起来……这其实是构造⽅法注⼊⽅式的缺点。
⽅法5:把IDEA的警告关掉。
个⼈没试过,也没有动⼒去试。没有提⽰的IDEA 是没有灵魂的,我从来不去修改IDEA的任何警告设置。
⽅法6:安装mybatis plugin即可解决该问题。
总结:
以上是解决问题的6种⽅法。问题本⾝其实⽐较简单,但其实隐藏的知识点其实挺多的,例如:
@Autowired和@Resource有什么区别。
为什么 Spring不建议使⽤field⽅式注⼊。
@Repository、@Componnt、@Controller、@Service有什么区别。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论