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注解区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • servlet实现文件上传、预览、下载、删除功能

    servlet实现文件上传、预览、下载、删除功能

    这篇文章主要为大家详细介绍了servlet实现文件上传、预览、下载、删除功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • 一文带你掌握Java中Scanner类的使用

    一文带你掌握Java中Scanner类的使用

    Scanner类是java.util包中的一个类,常用于控制台的输入,当需要使用控制台输入时即可调用这个类。本文将通过一些简单的例子为大家介绍一下Java中Scanner类的使用,需要的可以参考一下
    2023-04-04
  • java实现基于UDP协议网络Socket编程(C/S通信)

    java实现基于UDP协议网络Socket编程(C/S通信)

    这篇文章主要介绍了java实现基于UDP协议网络Socket编程(C/S通信),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • Java中图片的常用操作代码总结

    Java中图片的常用操作代码总结

    这篇文章主要为大家详细介绍了Java中对图片进行常用操作处理的代码,例如生成自定义图片、获取图片格式、图片的裁剪与压缩等,感兴趣的小伙伴可以了解一下
    2022-11-11
  • IDEA性能优化方法解决卡顿问题

    IDEA性能优化方法解决卡顿问题

    本文主要介绍了如何在不升级电脑配置的情况下通过修改IntelliJIDEA的设置来优化其性能,从而提升开发效率
    2024-12-12
  • Java对文本文件MD5加密并ftp传送到远程主机目录的实现方法

    Java对文本文件MD5加密并ftp传送到远程主机目录的实现方法

    这篇文章主要给大家介绍了关于Java对文本文件MD5加密并ftp传送到远程主机目录的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-08-08
  • java依赖混乱存在的问题与解决方案

    java依赖混乱存在的问题与解决方案

    这篇文章主要为大家介绍了java依赖混乱存在的问题与解决方案,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • No ‘Access-Control-Allow-Origin‘ header is present跨域及解决

    No ‘Access-Control-Allow-Origin‘ header is&nb

    这篇文章主要介绍了No ‘Access-Control-Allow-Origin‘ header is present跨域及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • java数据结构实现顺序表示例

    java数据结构实现顺序表示例

    这篇文章主要介绍了java数据结构实现顺序表示例,需要的朋友可以参考下
    2014-03-03
  • SpringCloud Config配置中心原理以及环境切换方式

    SpringCloud Config配置中心原理以及环境切换方式

    这篇文章主要介绍了SpringCloud Config配置中心原理以及环境切换方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03

最新评论