返回

开发者千万别再滥用@Autowired,否则后果很严重!

后端

Java 中的依赖注入:@Autowired@Resource 的对比

在 Java 世界中,@Autowired@Resource 是两个声名远播的注解,它们用于进行依赖注入,使我们能够自动装配 Bean,摆脱手动实例化的麻烦。尽管它们的功能相似,但在这两个注解之间存在一些重要的差异。

用法范围

  • @Autowired 是 Spring Boot 中自带的注解,可以应用于任何地方,包括类、方法和参数。
  • @Resource 是 J2EE 规范中的注解,仅能用于类和方法。

注解类型

  • @Autowired 是一个类型注解,可以标注在任何类型上。
  • @Resource 是一个字段注解,只能标注在字段上。

默认值

  • @Autowired 默认按类型匹配 Bean。
  • @Resource 默认按名称匹配 Bean。

匹配模式

  • @Autowired 仅支持按类型匹配。
  • @Resource 支持按类型和按名称两种匹配模式。

警告和错误

  • 如果使用 @Autowired 注解了一个不存在的 Bean,Spring Boot 会抛出一个异常。
  • 如果使用 @Resource 注解了一个不存在的 Bean,Spring Boot 则会显示一个警告。

何时使用 @Autowired@Resource

根据上述对比,我们可以得出以下结论:

  • 当按类型匹配 Bean 时,使用 @Autowired
  • 当按名称匹配 Bean 时,使用 @Resource
  • 当需要匹配多个 Bean 时,可以使用 @Autowired 并指定 @Qualifier 注解。
  • 当需要匹配一个不存在的 Bean 时,可以使用 @Resource 并指定 @Required 注解。

如何避免 @Autowired@Resource 的警告和错误?

为避免 @Autowired@Resource 的警告和错误,我们可以遵循以下最佳实践:

  • 确保 Bean 的名称与其实例类名一致。
  • 确保 Bean 的名称是唯一的。
  • 确保 Bean 的类型与其实例类一致。
  • 确保 Bean 的作用域与其实例类一致。
  • 确保 Bean 的初始化方法与其实例类一致。

代码示例

@Autowired

@Autowired
private UserService userService;

@Resource

@Resource(name = "userService")
private UserService userService;

结论

@Autowired@Resource 都是非常有用的注解,可以轻松实现依赖注入。但是,它们的用法和语义存在一些差异,因此在使用时应仔细权衡。通过遵循最佳实践,可以避免出现警告和错误,并充分利用这两个注解的优点。

常见问题解答

  1. @Autowired@Resource 之间哪个更好?
    答案:两者都是有效的依赖注入注解,选择哪一个取决于具体情况和个人偏好。

  2. 可以使用 @Resource 来注入其他注解的 Bean 吗?
    答案:可以,可以使用 @Resource(type = MyAnnotation.class) 来注入带有 @MyAnnotation 注解的 Bean。

  3. 如何指定 @Autowired 匹配多个 Bean?
    答案:可以使用 @Autowired@Qualifier 注解,例如:@Autowired @Qualifier("userServiceImpl1") private UserService userService1;

  4. @Autowired@Required 注解有什么区别?
    答案:@Autowired 用于自动装配 Bean,而 @Required 用于指定 Bean 必须存在,否则会抛出一个异常。

  5. @Autowired 可以与构造函数一起使用吗?
    答案:可以,可以使用 @Autowired 注解构造函数的参数,例如:public MyClass(@Autowired UserService userService) {}