自学内容网 自学内容网

@Autowired和@Resource的区别 详细讲解-包含面试题

@Autowired和@Resource的区别

一,介绍

1.@Autowired


@Autowired 是 Spring 框架提供的一个注解,它简化了依赖注入的过程。通常情况下,当我们需要让一个类使用另一个类的功能时,我们可以在前者中声明后者的一个实例。使用 @Autowired 注解后,Spring 容器会在运行时自动将合适的实例注入到声明了该注解的成员变量或构造函数中。

使用方式

  • 字段/接口注入:直接在需要注入的对象前加上 @Autowired

    @Autowired
    private UserRepository userRepository;
    
  • 构造函数注入:在构造函数参数上使用 @Autowired,这样可以确保依赖项不是可选的,并且在构造函数调用时就已经确定。

    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
    
  • 方法注入:在 setter 方法或任意方法的参数上使用 @Autowired,这允许在运行时动态改变依赖关系。

    @Autowired
    public void setUserRepository(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
    

配置选项

  • Required 属性:默认情况下,@Autowired 要求所注入的 bean 必须存在(即 required=true)。如果找不到对应的 bean,Spring 将抛出异常。

  • 如果设置 required=false,则允许 Spring 在找不到对应 bean 时不抛出异常,而是简单地忽略这个注入点。此时,未找到的 bean 对应的注入点将会保持为 null。

    @Autowired(required=false)
    private Cat cat;
    

注意事项

  • 当有多个相同类型的 bean 可供注入时,可以使用 @Qualifier 注解来明确指定注入哪个 bean。
  • 在使用 @Autowired 时,建议对必填的依赖使用构造函数注入,这样可以清晰地表明哪些依赖是必须的,同时也方便测试。
  • 使用 @Autowired 时,Spring 容器负责管理依赖关系的创建和管理,从而减轻了开发者的负担,使代码更加简洁。

2.@Resource

好的,让我们整理一下关于@Resource注解的信息,并以更清晰的方式呈现:


@Resource 是一个来自 javax.annotation 包的标准Java注解,用于依赖注入。尽管它最初设计用于JSR-250规范,并不专属于Spring框架,但是Spring也支持使用这个注解来进行依赖注入。

使用方式

@Resource 可以应用于类、成员变量或方法上,用于标记需要自动装配的资源。默认情况下,@Resource 是按照名字来查找注入的bean (byName),但如果找不到名字匹配的bean,则会退回到按类型注入 (byType)。

示例代码

import javax.annotation.Resource;

public class ServiceClass {
    @Resource(name = "userService")
    private UserService userService;

    public void performAction() {
        userService.doSomething();
    }
}

在这个例子中,ServiceClass 类有一个 userService 成员变量,它被 @Resource 注解修饰,并指定了名字 "userService"。这意味着Spring容器需要提供一个名为 "userService" 的bean来注入到 userService 变量中。

属性详解

name属性
  • name 属性用于指定要注入的bean的名字。
  • 如果指定了 name 属性,Spring会尝试根据该名字来查找匹配的bean。
  • 如果没有指定 name 属性,则默认使用成员变量的名字作为bean的名字进行查找。
type属性
  • type 属性用于指定要注入的bean的类型。
  • 如果指定了 type 属性,Spring会根据类型来查找匹配的bean。
  • 如果没有指定 type 属性,并且也没有 name 属性,则默认使用成员变量的类型进行匹配。

默认行为

如果既没有指定 name 也没有指定 type,那么Spring会先尝试按名字(byName)来查找匹配的bean。如果找不到匹配的名字,那么它会退回到按类型(byType)来查找。如果按类型找到了多个匹配的bean,则会抛出异常。

综合使用

当同时指定 nametype 时,Spring会首先尝试按名字查找匹配的bean。如果找到了,就直接注入;如果没有找到,那么它会继续按类型来查找。如果最终还是没有找到唯一匹配的bean,或者找到了多个,那么也会抛出异常。


二,@Autowired和@Resource的区别

您的描述中有一些地方需要澄清,特别是有关@Resource@Autowired的一些细节。以下是关于这两个注解之间的区别的准确说明:

  1. 提供者

    • @Autowired 是由Spring框架提供的,用于依赖注入。
    • @Resource 是来自 javax.annotation 包的标准Java注解,虽然Spring支持该注解,但它不是Spring独有的。
  2. 装配方式

    • @Autowired 默认按类型进行装配(byType)。如果要按名称装配,则需要结合 @Qualifier 注解来指定具体的bean名称。
    • @Resource 默认按名称进行装配(byName),如果找不到与名称匹配的bean,则退回到按类型装配(byType)。
  3. 依赖的bean存在性

    • @Autowired 默认情况下要求被注入的bean必须存在。如果找不到匹配的bean,则会抛出异常。然而,可以通过设置 @Autowired(required=false) 来忽略缺失的bean,此时如果没有找到匹配的bean,则注入点将为null。
    • @Resource 如果找不到与名称匹配的bean,则会按类型装配。如果仍然找不到,则会抛出异常,而不是不强制要求依赖的bean存在。
  4. 支持的自动装配类型

    • @Autowired 专门用于Spring框架内的bean装配。
    • @Resource 可以用于任何实现了JSR-250规范的应用程序中,并且不仅仅限于Spring框架,也可以在其他容器中使用。此外,@Resource 还可以用于EJB组件中。

简结

  • @Autowired 更加专注于Spring框架的上下文,而 @Resource 是更通用的依赖注入方式。
  • @Autowired 默认按类型装配,而 @Resource 默认按名称装配。
  • 两者都支持按类型装配,但 @Resource 先按名称装配,找不到才按类型装配。
  • 关于依赖的bean是否存在,两者都需要存在匹配的bean,除非特别配置。

在实际应用中,选择哪个注解取决于具体的需求和上下文环境。如果是在Spring框架内进行依赖注入,并且想要利用Spring的所有特性,那么@Autowired可能是更好的选择。而在需要更广泛兼容性的场景下,@Resource可能更适合。


原文地址:https://blog.csdn.net/qq_49841284/article/details/142359325

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!