深入理解@Resource与@Autowired:用法与区别解析

@Resource

@Resource 是Java EE提供的注解,也可以在Spring中使用。它是按照名称进行注入的,默认通过属性名(通常是类名的小驼峰命名方式)或者name属性来匹配。如果找不到符合名称的bean,则会抛出异常。在使用时可以指定 name 属性来明确指定要注入的bean的名称,也可以通过 type 属性来指定要注入的bean的类型。 示例:

假设有一个叫做 SomeBean 的类:

@Component
public class SomeBean {
    // ...
}

使用 @Resource 注解来注入该类的实例时,可以直接在需要注入的属性上使用 @Resource 注解,属性名会被默认匹配到对应的bean:

@Component
public class AnotherBean {
    @Resource
    private SomeBean someBean;
    // ...
}

但需要注意以下问题:

  1. 命名不一致:如果属性名与bean的名称不一致,将无法正确匹配到对应的bean,会抛出异常。此时可以通过指定 name 属性来明确指定要注入的bean的名称

    @Component
    public class AnotherBean {
        @Resource(name = "otherName")
        private SomeBean someBean;
        // ...
    }

    我们使用 @Resource 注解的 name 属性指定了要注入的 bean 的名称为 "otherName"。因此,Spring 会在容器中查找名称为 "otherName" 的 bean,并将其注入到 AnotherBean 类的 someBean 属性中

  2. 多个匹配项:如果存在多个符合类型的bean,且都符合属性名匹配规则,会抛出异常。此时可以通过指定 name 属性来明确指定要注入的bean的名称,或者结合 @Qualifier 注解使用。

    举个例子,假设有两个名为 someBean1someBean2 的 bean:

    @Component("someBean1")
    public class SomeBean {
        // ...
    }
    ​
    @Component("someBean2")
    public class AnotherBean {
        // ...
    }
    ​
    @Component
    public class YetAnotherBean {
        @Autowired
        @Qualifier("someBean1")
        private SomeBean someBean;
        // ...
    }

    @Qualifier 注解中的值应该是要注入的 bean 的名称或标识符,而不是属性名或类名。

@Autowired

@Autowired是Spring框架提供的注解,在Spring中广泛应用。它默认按照类型进行注入,通过匹配对象类型来实现自动装配。如果存在多个匹配的bean,可以使用 @Qualifier 注解结合 @Autowired 来指定具体的bean名称进行注入。 示例:

@Autowired
private SomeBean someBean;
  • @Autowired 是非必须的,如果找不到匹配的Bean,Spring容器仍然会正常启动。

  • @Resource 是必须的,如果找不到匹配的Bean,会抛出异常。

 总结:对于使用 Spring Boot 项目,通常建议优先使用 @Autowired 注解。因为 Spring Boot 默认集成了 Spring 框架,并做了一些自动配置,@Autowired 可以更好地适应和利用 Spring Boot 的特性。此外,@Autowired 的语义也更加清晰和直观。因为它是 Spring 提供的原生注解,而且更加灵活。

如果你的项目同时使用了 JavaEE 相关技术,可能更倾向于使用 @Resource

你可能感兴趣的:(spring,spring,boot,java,mvc,笔记)