@Autowired和@Resource的区别是什么

引言

当涉及到Spring框架中的依赖注入时,@Autowired和@Resource是两个常用的注解。它们都可以用来注入Bean,并且在实际开发中经常被使用。然而,@Autowired和@Resource之间存在一些重要的区别,包括适用范围、注入规则和注解来源等方面。

在这篇博客中,我们将深入探讨@Autowired和@Resource的区别,帮助读者更好地理解这两个注解的作用和使用场景。我们将从基本概念开始,介绍@Autowired和@Resource的定义和用法,然后逐步比较它们之间的异同点。通过本文,读者将能够清晰地理解@Autowired和@Resource的区别。

无论是初学者还是有经验的开发人员,都可以通过本文对@Autowired和@Resource的区别有一个清晰的认识,从而更好地应用它们在实际项目中。希望本文能够为读者提供有益的知识,帮助他们更好地理解Spring框架中的依赖注入机制。

两个注解的区别

@Autowired和@Resource都是用于自动装配的注解,它们有一些相同点和不同点。

相同点:

  1. 自动装配:两者都可以用于自动装配Spring Bean,省去了手动配置Bean的过程。
  2. 都支持byName和byType的自动装配方式。

不同点:

  1. 来源:@Autowired是Spring提供的注解,而@Resource是JSR-250规范定义的注解,因此@Autowired是Spring特有的,而@Resource是Java EE的一部分,因此可以在不使用Spring的情况下使用@Resource。
  2. 作用对象:@Autowired可以用在构造方法、属性、方法和参数上,而@Resource只能用在字段上。
  3. 依赖性:@Autowired是按照类型进行自动装配,而@Resource默认按照名称进行自动装配,如果找不到匹配的bean名称,再按照类型进行匹配。
  4. 可选性:@Autowired默认要求依赖对象必须存在,如果找不到合适的Bean,会抛出异常。而@Resource默认是允许依赖对象不存在的,可以通过设置required属性来控制是否必须存在。

@Autowired和@Resource都是用于自动装配Spring Bean的注解,但它们的使用方式、来源和一些细节上有所不同。

代码示例

创建一个TestService接口和两个TestServiceImpl1、TestServiceImpl2实现类

java 复制代码
//TestService.java
public interface TestService {
    String test();
}

//TestServiceImpl1.java
@Service
public class TestServiceImpl1 implements TestService{
    @Override
    public String test() {
        return "test1";
    }
}

//TestServiceImpl2.java
@Service
public class TestServiceImpl2 implements TestService {
    @Override
    public String test() {
        return "test2";
    }
}

默认命名规则:如果没有显式指定Bean的名称,则Spring会使用默认的命名规则。默认的命名规则是使用类的名称,首字母小写作为Bean的名称。例如,一个名为UserService的类会被默认命名为"userService"。

测试@Autowired

使用@Autowired进行注入

java 复制代码
@RestController
public class UserController {
    
    @Autowired
    TestService testService;

    @GetMapping("/hello")
    public String test() {
        return testService.test();
    }
}

IDEA直接提示报错,提示这儿不止一个TestService类型

加上一个@Qualifier注解(@Qualifier是Spring框架中用来指定具体要注入的Bean的注解。通常与@Autowired一起使用,当有多个实现类满足@Autowired的要求时,可以使用@Qualifier指定具体要注入的Bean的名称。)

此处指定一个Bean的名称

java 复制代码
@RestController
public class UserController {
    @Autowired
    @Qualifier("testServiceImpl1")
    TestService testService;

    @GetMapping("/hello")
    public String test() {
        return testService.test();
    }
}

重新指定一个Bean

java 复制代码
@RestController
public class UserController {
    @Autowired
    @Qualifier("testServiceImpl2")
    TestService testService;

    @GetMapping("/hello")
    public String test() {
        return testService.test();
    }
}

测试@Resource

基于之前的UserController,将注入方式修改为@Resource

java 复制代码
@RestController
public class UserController {
    @Resource
    TestService testService;

    @GetMapping("/hello")
    public String test() {
        return testService.test();
    }
}

IDEA没有提示报错,但是运行报错,@Resource是根据Bean的名称注入,如果找不到匹配的bean名称,再按照类型进行匹配,此处通过名称并未找到bean,通过类型也未找到相应的bean

启动报错:

No qualifying bean of type 'com.example.interviewtest.service.TestService' available: expected single matching bean but found 2: testServiceImpl1,testServiceImpl2

指定bean的名称

java 复制代码
@RestController
public class UserController {
    @Resource(name = "testServiceImpl1")
    TestService testService;

    @GetMapping("/hello")
    public String test() {
        return testService.test();
    }
}

指定另一个bean的名称

java 复制代码
@RestController
public class UserController {
    @Resource(name = "testServiceImpl2")
    TestService testService;

    @GetMapping("/hello")
    public String test() {
        return testService.test();
    }
}

参考资料

@Autowired和@Resource的区别是什么?_哔哩哔哩_bilibili

相关推荐
香精煎鱼香翅捞饭3 分钟前
java通用自研接口限流组件
java·开发语言
浪遏9 分钟前
面试官😏 :文本太长,超出部分用省略号 ,怎么搞?我:🤡
前端·面试
ChinaRainbowSea22 分钟前
Linux: Centos7 Cannot find a valid baseurl for repo: base/7/x86_64 解决方案
java·linux·运维·服务器·docker·架构
囧囧 O_o22 分钟前
Java 实现 Oracle 的 MONTHS_BETWEEN 函数
java·oracle
去看日出25 分钟前
RabbitMQ消息队列中间件安装部署教程(Windows)-2025最新版详细图文教程(附所需安装包)
java·windows·中间件·消息队列·rabbitmq
计算机-秋大田28 分钟前
基于Spring Boot的宠物健康顾问系统的设计与实现(LW+源码+讲解)
java·vue.js·spring boot·后端·课程设计
JouJz35 分钟前
Java虚拟机之垃圾收集(一)
java·开发语言·jvm
uhakadotcom39 分钟前
OpenHands:AI 驱动的软件开发框架
后端·面试·github
午后书香41 分钟前
一天三场面试,口干舌燥要晕倒(二)
前端·javascript·面试
源码姑娘1 小时前
基于DeepSeek的智慧医药系统(源码+部署教程)
java·人工智能·程序人生·毕业设计·springboot·健康医疗·课程设计