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

相关文章

  • Spring Security OAuth过期的解决方法

    Spring Security OAuth过期的解决方法

    这篇文章主要介绍了Spring Security OAuth过期的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • 解析Apache Dubbo的SPI实现机制

    解析Apache Dubbo的SPI实现机制

    SPI全称为Service Provider Interface,对应中文为服务发现机制。SPI类似一种可插拔机制,首先需要定义一个接口或一个约定,然后不同的场景可以对其进行实现,调用方在使用的时候无需过多关注具体的实现细节
    2021-06-06
  • Java基础篇_有关接口和抽象类的几道练习题(分享)

    Java基础篇_有关接口和抽象类的几道练习题(分享)

    下面小编就为大家带来一篇Java基础篇_有关接口和抽象类的几道练习题(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • SpringBoot配置MyBatis-Plus实现增删查改

    SpringBoot配置MyBatis-Plus实现增删查改

    本文主要介绍了SpringBoot配置MyBatis-Plus实现增删查改,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • java实现多线程交替打印两个数

    java实现多线程交替打印两个数

    这篇文章主要为大家详细介绍了java实现多线程交替打印两个数,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • Springboot GET和POST请求参数获取方式小结

    Springboot GET和POST请求参数获取方式小结

    Spring Boot GET和POST请求参数获取是开发人员经常需要解决的问题,本文主要介绍了Springboot GET和POST请求参数获取方式小结,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • springboot自动装配TypeNotPresentExceptionProxy异常排查解决

    springboot自动装配TypeNotPresentExceptionProxy异常排查解决

    这篇文章主要为大家介绍了springboot自动装配TypeNotPresentExceptionProxy异常排查解决,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • 使用FeignClient调用POST表单Body内没有参数问题

    使用FeignClient调用POST表单Body内没有参数问题

    这篇文章主要介绍了使用FeignClient调用POST表单Body内没有参数问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • 一文详解JavaWeb过滤器(Filter)

    一文详解JavaWeb过滤器(Filter)

    本文主要介绍了一文详解JavaWeb过滤器(Filter),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • Java微服务间接口调用 feign

    Java微服务间接口调用 feign

    这篇文章主要介绍了微服务间的接口调用feign,Feign是一种声明式、模板化的HTTP客户端。在spring cloud中使用Feign,可以做到类似于普通的接口的请求调用,感兴趣的小伙伴可以参考阅读
    2023-03-03

最新评论