你好,我是风一样的树懒,一个工作十多年的后端开发,曾就职京东、阿里等多家互联网头部企业。
在 Spring 中,@Resource 和 @Autowired 都是用于依赖注入(DI,Dependency Injection)的注解。虽然它们的功能相似,但在行为和用法上有一些区别。以下是它们的详细对比:
@Autowired:来自 Spring 框架,属于 Spring 的依赖注入注解。
@Resource:来自 Java 的 javax.annotation 包,属于 JSR-250 规范。Spring 支持 @Resource,它通常用在基于 Java EE 的项目中。
@Autowired:默认按 类型(byType)注入。Spring 会根据字段或方法参数的类型进行匹配,找出最适合的 Bean。
可以指定按名称注入:通过 @Autowired 配合 @Qualifier 注解,可以按 名称(byName)注入。
@Resource:默认按 名称(byName)注入。Spring 会首先查找与字段名相同的 Bean,如果找到了,则将该 Bean 注入。如果没有找到与字段名匹配的 Bean,则会按 类型(byType)注入。
@Resource
private UserService userService; // 按名称 userService 注入
@Autowired
private UserService userService; // 按类型 userService 注入
@Autowired:
可以应用于构造函数、字段、或方法。
如果标注在构造函数上,Spring 会尝试自动注入该构造函数的参数。
只适用于字段或方法。
不支持构造函数注入。
// @Autowired 构造函数注入
@Autowired
public UserController(UserService userService) {
this.userService = userService;
}
// @Resource 字段注入
@Resource
private UserService userService;
@Autowired:
默认情况下,如果 Spring 容器找不到匹配的 Bean,且该依赖没有标记为 @Nullable 或使用 required = false,则会抛出 NoSuchBeanDefinitionException 异常。
可以通过 required 属性来控制是否允许空值注入,默认是 true。
(required = false)
private UserService userService; // 如果找不到 UserService,userService 为 null
@Resource:
默认情况下,如果没有找到匹配的 Bean,@Resource 注解不会抛出异常,而是会尝试根据类型来注入(如果字段名称没有匹配的 Bean)。
@Autowired:Spring 会根据 类型 进行自动注入。如果存在多个相同类型的 Bean,可以通过 @Qualifier 注解指定要注入的 Bean。
@Resource:@Resource 首先按 名称 注入,如果没有找到匹配的名称,则按 类型 注入。
private UserService userService; // 默认按名称 userService 注入
特性 | @Autowired | @Resource |
---|---|---|
注解来源 | Spring 框架 | Java 标准(JSR-250) |
默认按 | 类型(byType) | 名称(byName),如果未找到则按类型(byType) |
可用于 | 构造函数、字段、方法 | 仅字段和方法 |
空注入处理 | 默认 required = true,可设置为 false | 默认允许按类型注入,按名称时会直接匹配 |
优先级 | @Qualifier 用于解决多个相同类型的 Bean | 按名称注入,未找到时按类型注入 |
如果你的代码遵循 Java EE 标准或你需要按照 名称 进行注入,使用 @Resource。
如果你使用 Spring 框架,并且希望利用 类型 自动注入(特别是当你不关心 Bean 名称时),使用 @Autowired。同时,Spring 提供了更多控制注入的功能,比如 @Qualifier 和 required 等。
今天的内容就分享到这儿,喜欢的朋友可以关注,点赞。有什么不足的地方欢迎留言指出,您的关注是我前进的动力!