简单说下我对@Resource解决红线的原理

来源:3-14 解决IDEA的红色警告

weixin_慕用7083551

2021-04-29

表面上来说,@Autowired默认byType,@Resource默认byName匹配,这个应该大家都问过百度了。

但为什么匹配方式不同会导致idea是否报错?

实际上spring中@Resource的默认处理虽然是byName,但是,其并非是直接通过beanId来匹配,只有指定name时,才会去spring上下文通过beanId寻找匹配对象。

引用《@Resource注解工作原理》(@攀爬的阿杜)中的一段话:(就不自己写了。)
@Rsource如果不指定value值,会根据属性名或者方法名的第一个参数的参数名生成一个默认的name,并且封装的对象属性会设置一个标志(this.isDefaultName),标记该对象的name是默认生成的,还是指定的.
所以如果@Resource注解指定了某个字符串,则会根据指定的字符串去查找,如果根据名字不匹配,则会报错,找不到,而不是继续根据类型匹配
————————————————
版权声明:本文为CSDN博主「攀爬的阿杜」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_36368893/article/details/109241970

实际上因为其默认名生成规则是不完全确定的,因此idea很难根据这个规则来找到适合的类,因此会跳过检查。

以上是我个人理解,望指教。

写回答

1回答

大目

2021-05-05

您好,您贴的内容没有问题。


不过有一点,之所以@Autowired之所以会报错,是因为@Autowired(required = boolean)的 required 属性,默认是true,这意味着,当Spring找不到这个bean的时候,就会报错。

IDEA比较“聪明”,它能理解spring 注解的含义,于是他去找bean,但是IDEA对mybatis的支持并不是那么好,所以他不知道mybatis的mapper会形成spring bean代理。于是认为找不到,就给我们报警告。

@Resource则没有这种问题,因为它没有这种属性。

其实倒不是因为byName,byType的问题

0
0

Spring Cloud Alibaba微服务从入门到进阶

面向未来微服务:熟练掌握Spring Cloud Alibaba

3085 学习 · 1324 问题

查看课程