简单说下我对@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的问题
00
相似问题