Skip to content

@Autowired@Resource的区别

@Autowired@Resource 都是 Spring 框架中用于依赖注入的注解,但它们之间有一些关键的区别,选择哪个更好取决于你的具体需求和偏好。

@Autowired

  • 来源:Spring 框架提供的注解。
  • 功能:用于自动装配 bean,可以装配到构造器、字段、setter 方法等。默认情况下,它要求依赖对象必须存在,如果找不到会抛出异常,但可以通过设置 required=false 来允许依赖项为 null。
  • 按类型装配@Autowired 默认按照类型(byType)装配依赖,如果容器中存在多个相同类型的 bean,则可以通过 @Qualifier 注解来指定名称(byName)进行装配。
  • 灵活性:支持泛型注入,对于复杂的依赖关系,提供了更多的灵活性。

@Resource

  • 来源:JSR-250 提供的注解,Spring 框架支持。
  • 功能:用于注入一个 bean,可以工作于字段、setter 方法或构造器上。
  • 按名称装配@Resource 默认按照名称(byName)装配依赖,如果找不到匹配的 bean 名称,则回退到按类型(byType)装配。
  • JSR 标准:因为它是 Java EE 的一部分,所以如果你的项目同时需要兼容 Java EE 和 Spring,使用 @Resource 可能是一个更好的选择。

选择哪个更好?

  • 如果你更偏好 Spring 的方式,并且你的项目主要使用 Spring 框架,那么 @Autowired 可能是一个更好的选择。它提供了更多的灵活性和与 Spring 框架的紧密集成。
  • 如果你需要你的项目与 Java EE 兼容,或者你已经习惯了使用 JSR-250 提供的注解,那么 @Resource 可能更适合你
  • 在大多数情况下,两者都可以很好地工作,选择哪个主要取决于个人或团队的偏好以及项目的具体需求

注意事项

  • 过度使用自动装配可能会导致代码难以测试和维护,因为它隐藏了组件之间的依赖关系。
  • 在某些情况下,可能需要显式地指定依赖项的名称或类型,以避免自动装配的歧义。
  • 考虑到 @Autowired 的默认行为(按类型装配),如果容器中存在多个相同类型的 bean,可能会导致意外的装配结果。在这种情况下,使用 @Qualifier@Resource(按名称装配)可能更安全。