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

相关文章

  • Java中synchronized的优化措施

    Java中synchronized的优化措施

    这篇文章主要介绍了Java中synchronized的优化,介绍为了实现高效并发,虚拟机对synchronized 做的一系列的锁优化措施,本文给大家介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • Java基础知识总结之继承

    Java基础知识总结之继承

    这一篇我们来学习面向对象的第二个特征——继承,文中有非常详细的基础知识总结,对正在学习java的小伙伴们很有帮助,需要的朋友可以参考下
    2021-06-06
  • springboot配合Thymeleaf完美实现遍历功能

    springboot配合Thymeleaf完美实现遍历功能

    Thymeleaf显然是一个开发页面的技术,现在各种前端技术层出不穷,比如现在主流的Vue、React、AngularJS等。这篇文章主要介绍了springboot配合Thymeleaf完美实现遍历,需要的朋友可以参考下
    2021-09-09
  • JAVA中时间戳与LocalDateTime互相转换代码例子

    JAVA中时间戳与LocalDateTime互相转换代码例子

    最近在编码过程中遇到将时间戳转化为 LocalDateTime,所以这里给总结下,这篇文章主要给大家介绍了关于JAVA中时间戳与LocalDateTime互相转换的相关资料,需要的朋友可以参考下
    2023-11-11
  • 在SpringBoot中注入RedisTemplate实例异常的解决方案

    在SpringBoot中注入RedisTemplate实例异常的解决方案

    这篇文章主要介绍了在SpringBoot中注入RedisTemplate实例异常的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Java%(取模运算)全面讲解

    Java%(取模运算)全面讲解

    这篇文章主要介绍了Java%(取模运算)全面讲解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • java stream中Collectors的用法实例精讲

    java stream中Collectors的用法实例精讲

    这篇文章主要为大家介绍了java stream中Collectors的用法实例精讲,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • 如何修改JSON字符串中的敏感信息

    如何修改JSON字符串中的敏感信息

    这篇文章主要介绍了如何修改JSON字符串中的敏感信息,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Java之PreparedStatement的使用详解

    Java之PreparedStatement的使用详解

    这篇文章主要介绍了Java之PreparedStatement的使用详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • 多个版本JAVA切换的简单步骤记录

    多个版本JAVA切换的简单步骤记录

    在工作中或者学习过程中,有一些特殊情况我们需要来切换java版本来做比较,比如一些新特性等等的相关资料,这篇文章主要介绍了多个版本JAVA切换的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2024-09-09

最新评论