返回
开发小贴士:巧妙区分 @Autowired 和 @Resource 的用法
后端
2023-10-23 19:36:38
在 Spring/Spring Boot 项目中,@Autowired 和 @Resource 都是用来进行依赖注入的注解。它们都提供了将依赖对象注入到当前对象的功能,但二者却有着一些不同。
- 基本原理
- @Autowired:在编译时自动将成员变量、方法或者构造方法自动注入指定的类。
- @Resource:可以将资源注入到带有符合特定条件的成员变量、方法或者构造方法中,条件是自动查找类型匹配的对象。
- 语法格式
- @Autowired:
- @Autowired(required = true):保证注入一定存在,如果没有匹配到候选者会抛出异常,如果匹配到多个候选者也会抛出异常。
- @Autowired(required = false):保证注入对象可以为空,如果匹配不到候选者不会抛出异常。
- @Resource:
- @Resource(name = "name"):根据名称注入 bean,可以自动查找类型匹配的对象。
- @Resource(type = "type"):根据类型注入 bean,可以自动查找类型匹配的对象。
- 区别
- 使用方式: @Autowired 可以通过字段、方法或构造方法注入依赖,而 @Resource 只能通过字段和方法注入依赖。
- 兼容性: @Autowired 可以与 @Qualifier 注解一起使用,以指定要注入的特定 bean,而 @Resource 不能。
- 作用范围: @Autowired 只能在 Spring 容器中使用,而 @Resource 可以在 Spring 容器中和 Java EE 容器中使用。
- 什么时候使用
- @Autowired: 当您需要注入的 bean 是由 Spring 容器管理的时,可以使用 @Autowired 注解。例如,如果您需要注入一个服务类,可以使用 @Autowired 注解将该服务类注入到您的 controller 类中。
- @Resource: 当您需要注入的 bean 不是由 Spring 容器管理的时,可以使用 @Resource 注解。例如,如果您需要注入一个第三方库中的类,可以使用 @Resource 注解将该类注入到您的类中。
- 示例
@Autowired
private UserService userService;
@Resource
private OrderService orderService;
在上面的代码中,我们使用 @Autowired 注解将 UserService 注入到 Controller 类中,因为 UserService 是由 Spring 容器管理的。我们使用 @Resource 注解将 OrderService 注入到 Controller 类中,因为 OrderService 不是由 Spring 容器管理的。
- 总结
@Autowired 和 @Resource 都是 Spring/Spring Boot 中用于依赖注入的注解,但二者还是存在一些区别的。在实际项目开发中,您需要根据具体情况选择合适的注解来进行依赖注入。