@Autowired 为什么会被 IDEA 警告| 既生@Resource,何生@Autowired?

我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。

@Autowired和@Resource的区别与推荐用法
1. @Resource和@Autowired的一些总结
1.1 @Resource和@Autowired来源
@Resource来源于JSR 250标准,于2006年发布,主要用于标记应用程序需要的资源,可应用于字段或方法。而@Autowired是Spring框架的注解,于2007年发布,是自动装配的一部分。
1.2 为什么Spring官方支持两个功能相似的注解
@Resource优先按名称注入,找不到名称时按类型注入;@Autowired直接按类型注入。Spring引入@Autowired是为了增加控制的灵活性,覆盖更多场景。
1.3 “粒度”是指什么?
@Resource倾向于按名称找特定资源,而@Autowired在类型范围内搜索匹配资源。它们的区别在于资源查找范围不同。
1.4 Spring为什么支持两个功能相似的注解
@Resource是标准化规范,兼容其他JSR-250框架,方便迁移;@Autowired是Spring特有,功能更灵活但依赖Spring容器。
1.5 Spring的区别对待
IDE对@Autowired使用时会推荐构造方法注入,而@Resource没有类似警告。原因在于@Autowired注入存在一些限制,如循环依赖问题、无法声明常量属性等。此外,@Resource是Java标准,兼容更多IoC容器。
2. @Autowired和@Resource推荐用法
@Resource适用于单一资源注入,而@Autowired适用于按类型匹配的资源注入,尤其是集合注入。
2.1 构造方法注入推荐使用
构造方法注入可以避免循环依赖问题,是最可靠的注入方式。代码示例如下:
private final TutorialService tutorialService; public TutorialController(TutorialService tutorialService) { this.tutorialService = tutorialService; }
2.2 构造方法注入简化版
通过使用lombok的@RequiredArgsConstructor注解,可以自动生成构造器以简化代码编写。示例代码:
@RestController @RequestMapping("tutorial") @RequiredArgsConstructor public class TutorialController { private final TutorialService tutorialService; }
2.3 set注入
set注入通过@Autowired作用于Setter方法上,而不是直接作用于成员变量。代码示例:
@RestController @RequestMapping("tutorial") public class TutorialController { private TutorialService tutorialService; public void setTutorialService(TutorialService tutorialService) { this.tutorialService = tutorialService; } }
2.4 set注入简化版
通过使用@Setter注解的简化方式实现set方法注入,代码示例如下:
@RestController @RequestMapping("tutorial") public class TutorialController { @Setter(onMethod_ = {@Autowired}) private TutorialService tutorialService; }
如果您觉得本文不错,欢迎点赞、收藏或转发支持!
想要了解更多内容?



白皮书上线