Spring中@Autowired和@Resource注解的使用区别详解

 更新时间:2023年11月06日 08:43:50   作者:Sterne_  
这篇文章主要介绍了Spring中@Autowired和@Resource注解的使用区别详解,@Autowired默认根据type进行注入,找到与指定类型兼容的 Bean 并进行注入,如果无法通过type匹配到对应的 Bean 的话,会根据name进行匹配,如果都匹配不到则抛出异常,需要的朋友可以参考下

1. @Autowired

@Autowired是由Spring提供的注解

@Autowired的bean的匹配规则

@Autowired默认根据type进行注入,找到与指定类型兼容的 Bean 并进行注入,如果无法通过type匹配到对应的 Bean 的话,会根据name进行匹配,如果都匹配不到则抛出异常。

  • @Autowired 默认是按照类的类型去匹配。如果存在一个相同类型的bean,则注入该bean。
  • 如果存在多个 bean,但只有一个 bean 拥有 @Primary 注解,则将带有 @Primary 注解的 bean 注入。@Primary 注解用于指定默认首选的 bean。
  • 如果存在多个 bean,可以使用@Qualifier注解,配合该注解指定bean的具体名称,根据名称去识别bean。
  • 如果存在多个 bean,可以使用 List 或 Set 数据结构来接收所有匹配的 bean。Spring 将自动将所有匹配的 bean 放入这些集合中。
  • 如果存在多个 bean,没有配合上述的方案,则将抛出 NoUniqueBeanDefinitionException 异常。

在这里插入图片描述

@Autowired的required属性

默认情况下,required = true,即依赖bean必须存在,如果不存在,则会抛出异常。但是,通过将required属性设置为false,则依赖bean不存在也不会报错。

在这里插入图片描述

2. @Resource

@Resource是Java EE规范的一部分,但Spring同样支持该注解。

@Resource的bean的匹配规则

默认根据name进行注入,如果无法通过名称匹配到对应的 Bean 的话,会根据type进行匹配,找到与指定类型兼容的 Bean 并进行注入,如果都匹配不到则抛出异常。

使用 name 属性指定资源的名称

@Component
public class MyClass {
    // 名为 "myBean1" 的 bean 将会被注入
    @Resource(name = "myBean1")
    private MyBean myBean;
}

使用默认名称匹配资源

@Component
public class MyClass {
    // 名为“mybean”的bean将被注入
    @Resource
    private MyBean myBean;
}

根据type 属性来指定要注入的bean类型

public interface MyService {
    void fetchData();
}
@Component
public class MyServiceA implements MyService {
    public void fetchData() {
        System.out.println("from MyServiceA");
    }
}
@Component
public class MyServiceB implements MyService {
    public void fetchData() {
        System.out.println("from MyServiceB");
    }
}
@Component
public class DataProcessor {
    // 根据指定type注入myServiceA的bean
    @Resource(type = MyServiceA.class)
    private MyService myService;
    // 与上面效果相同注入myServiceA的bean
    @Resource
    private MyServiceA myServiceA;
    // 与上面效果相同注入myServiceA的bean
    @Resource
    private MyService myServiceA;
    // 与上面效果相同注入myServiceA的bean
    @Resource(name = "myServiceA")
    private MyService myService;
    // 注入bean失败,存在两个bean
    @Resource
    private MyService myService;
}

@Resource不存在required属性

到此这篇关于Spring中@Autowired和@Resource注解的使用区别详解的文章就介绍到这了,更多相关@Autowired和@Resource注解区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 手把手教你实现idea中配置国内源

    手把手教你实现idea中配置国内源

    idea的国内源配置十分重要,能够提升程序开发的效率而且也是减少bug的一种有效防范,本文就来介绍一下idea中配置国内源,具有一定的参考价值,感兴趣的可以了解一下
    2023-07-07
  • SpringBoot实现多租户系统架构的5种设计方案介绍

    SpringBoot实现多租户系统架构的5种设计方案介绍

    多租户(Multi-tenancy)是一种软件架构模式,允许单个应用实例服务于多个客户(租户),同时保持租户数据的隔离性和安全性,本文分享了SpringBoot环境下实现多租户系统的5种架构设计方案,需要的可以参考一下
    2025-05-05
  • java 中数组初始化实例详解

    java 中数组初始化实例详解

    这篇文章主要介绍了 本文主要讲数组的初始化方法、可变参数列表以及可变参数列表对函数重载的影响的相关资料,需要的朋友可以参考下
    2017-05-05
  • Springboot-yaml配置和自动配置原理分析

    Springboot-yaml配置和自动配置原理分析

    这篇文章主要介绍了Springboot-yaml配置和自动配置原理分析,自动配置原理是配置文件配置debug: true可以在控制台打印自动配置报告.可以打印所有的启动的自动配置和没有启动的自动配置类,需要的朋友可以参考下
    2021-06-06
  • springBoot中的properties配置解析

    springBoot中的properties配置解析

    这篇文章主要介绍了springBoot中的properties配置解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • 关于spring中事务的传播机制

    关于spring中事务的传播机制

    这篇文章主要介绍了关于spring中事务的传播机制,所谓事务传播机制,也就是在事务在多个方法的调用中是如何传递的,是重新创建事务还是使用父方法的事务,需要的朋友可以参考下
    2023-05-05
  • Java Switch对各类型支持实现原理

    Java Switch对各类型支持实现原理

    这篇文章主要介绍了Java Switch对各类型支持实现原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • Java使用IntelliJ IDEA连接MySQL的详细教程

    Java使用IntelliJ IDEA连接MySQL的详细教程

    这篇文章主要给大家介绍了关于Java使用IntelliJ IDEA连接MySQL的相关资料,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • java/word+fusionchart生成图表深入分析

    java/word+fusionchart生成图表深入分析

    本文将以java/word+fusionchart生成图表问题深入解析,有兴趣的朋友可以参考下
    2012-11-11
  • idea启动项目提示端口占用的问题解决

    idea启动项目提示端口占用的问题解决

    有时候当我们使用Tomcat启动web项目时,会提示端口占用,导致启动失败,本文就来介绍一下端口占用的解决方法,具有一定的参考价值,感兴趣的可以了解下
    2023-08-08

最新评论