Home
img of docs

深入解析 Spring Cloud 中的 @Resource 和 @Autowired 注解的区别,以及它们在依赖注入中的使用场景和应用。

chou403

/ Spring

/ c:

/ u:

/ 4 min read


spring cloud resource 和 Autowired 什么区别

在 Spring 框架中,@Resource@Autowired 是用于依赖注入的两种注解,但它们有一些重要的区别。理解这些区别有助于选择适合你的应用场景的注解。

@Autowired

@Autowired 是 Spring 框架提供的注解,用于自动装配依赖。

特点
  1. 按类型装配: 默认情况下,@Autowired 按照类型(by type)进行装配。如果有多个相同类型的 bean,Spring 会根据其他因素(如 @Primary@Qualifier)进行装配。
  2. Spring 特有: @Autowired 是 Spring 框架特有的注解。
  3. 可用于构造函数,字段和方法: 可以使用在构造函数,字段,Setter 方法和任意方法上。
  4. 可选属性: 可以设置 required 属性来指示是否必须注入(默认为 true)。
示例

字段注入:

   @Autowired
private MyService myService;

构造函数注入:

   @Autowired
public MyController(MyService myService) {
    this.myService = myService;
}

Setter 方法注入:

   @Autowired
public void setMyService(MyService myService) {
    this.myService = myService;
}

@Resource

@Resource 是 Java 标准注解(JSR-250),Spring 对其进行了支持。

@Resource特点
  1. 按名称装配: 默认情况下,@Resource 按照名称(by name)进行装配。如果找不到与名称匹配的 bean,Spring 会回退到按类型装配。
  2. Java 标准: @Resource 是 Java 标准的一部分,因此在不同的依赖注入框架中也可以使用。
  3. 可用于字段和 Setter 方法: 可以使用在字段和 Setter 方法上。
@Resource示例

字段注入:

   @Resource
private MyService myService;

Setter 方法注入:

   @Resource
public void setMyService(MyService myService) {
    this.myService = myService;
}

关键区别

  1. 装配方式:

    • @Autowired: 默认按类型装配。
    • @Resource: 默认按名称装配。
  2. 注解来源:

    • @Autowired: 属于 Spring 框架。
    • @Resource: 属于 Java 标准(JSR-250)。
  3. 灵活性:

    • @Autowired: 可以在构造函数,字段和方法上使用,并且支持 @Qualifier 注解来进一步指定需要注入的 bean。
    • @Resource: 主要用于字段和 Setter 方法注入,可以通过 name 属性明确指定要注入的 bean。
  4. 依赖注入容器的行为:

    • @Autowired: 如果无法满足依赖注入,可以通过设置 required 属性为 false 来避免异常。
    • @Resource: 如果无法满足依赖注入,默认会抛出异常。

何时使用

  • 使用 @Autowired: 当你需要按类型注入并希望使用 Spring 特有的功能和灵活性时。
  • 使用 @Resource: 当你需要按名称注入,或者希望使用与框架无关的标准注解时。

组合使用

有时,可能需要组合使用这两个注解。例如,当你需要按名称装配并且希望利用 Spring 提供的额外功能时,可以结合使用 @Autowired@Qualifier

   @Autowired
@Qualifier("specificBeanName")
private MyService myService;

通过了解和区分 @Autowired@Resource 的使用场景,你可以更灵活地管理 Spring 应用中的依赖注入。