首页 > 其他分享 >@Autowired 和 @Resource 的区别

@Autowired 和 @Resource 的区别

时间:2022-12-14 14:26:34浏览次数:38  
标签:Resource 区别 Autowired private smsService 报错 SmsService

@Autowired 与 @Resource

@Autowired属于 Spring 内置的注解,默认的注入方式为byType(根据类型进行匹配),也就是说会优先根据接口类型去匹配并注入 Bean (接口的实现类)。如果一个接口存在多个实现类,那么此时byType方式注入就会报错,无法注入。此时@Autowired会转换为以byName的形式去注入Bean。
举个例子:

 public interface SmsService{
    void sendSms();
 }
 @Service
 public class SmsServiceImpl1 implements SmsService{
 
   @Override
   public void sendSms(){
     System.out.println("我是Sms实现1");
   }
 }
 @Service
 public class SmsServiceImpl2 implements SmsService{
 
   @Override
   public void sendSms(){
     System.out.println("我是Sms实现2");
   }
 }
  @RestController
  pubic class SmsControllerTest{
  
  // 报错,因为两个实现类,先按byType方式不能唯一确定
  // 再按byName形式去找smsService这个名称的Bean也找不到
  @Autowired
  private SmsService smsService;
  }
  
  // 不报错,在byType方式找不到,按byName方式找到了名称为smsServiceImpl1的Bean,此种不推荐
  @Autowired
  private SmsService smsServiceImpl1;
  
  // 不报错,使用@Qualifier注解指定一个确定的Bean
  @Autowired
  @Qualifier(value = "smsServiceImpl1")
  private SmsService smsService;

@Resource属于 JDK 提供的注解,默认注入方式为 byName。如果无法通过名称匹配到对应的 Bean 的话,注入方式会变为byType,同样拿上面的列子进行举例:

  @RestController
  pubic class SmsControllerTest{
  
  // 报错,先按byName方式找smsService这个名称的Bean也找不到
  // 再按byType形式,因为两个实现类,所以也不能确定
  @Resource
  private SmsService smsService;
  }
  
  // 不报错,默认byName直接就能找到
  @Resource
  private SmsService smsServiceImpl1;
  
  // 不报错,推荐此种
  @Resource(name = "smsServiceImpl1")
  private SmsService smsService;
  
  // 报错,byType不唯一确定
  @Resource(type = SmsService.class)
  private SmsService smsService;
  
  // 不报错,byType唯一确定
  @Resource(type = smsServiceImpl1.class)
  private SmsService smsService;
  
  // 不报错,但不推荐此种
  @Resource(name = "smsServiceImpl1", type = SmsService.class)
  private SmsService smsService;

总结

  • @Autowired 是 Spring 提供的注解,@Resource 是 JDK 提供的注解。
  • @Autowired 默认的注入方式为byType(根据类型进行匹配),``@Resource默认注入方式为 byName`(根据名称进行匹配)。
  • 当一个接口存在多个实现类的情况下,@Autowired@Resource都需要通过名称才能正确匹配到对应的 Bean。@Autowired 可以通过 @Qualifier 注解来显式指定名称,@Resource可以通过 name 属性来显式指定名称

标签:Resource,区别,Autowired,private,smsService,报错,SmsService
From: https://www.cnblogs.com/hkz329/p/16981823.html

相关文章

  • 无代码开发和低代码开发的本质区别
    ​无代码和低代码开发都是现在新兴的一种软件开发方式,无代码顾名思义就是不需要编写代码就能够实现软件开发;低代码就是还是需要编写代码来实现软件开发,只不过低代码开发需......
  • 搞清webpack、vite、vue-cli、create-vue的区别
    1.要区分脚手架、构建项目、打包代码的概念1.1脚手架:创建项目,选择性安装需要的插件,指定统一的风格,生成demo。(vue-cli和create-vue是由vue提供的脚手架,创建项目时......
  • Python中json.dump()和json.dumps()的区别
    一、图解json.dumps(dict,indent):将Python对象转换成json字符串 json.dump(dict,file_pointer):将Python对象写入json文件  二、json.dumps()用法1、用法json.d......
  • 前端入门教程:CSS标准盒模型和怪异盒模型区别
    理解盒模型:CSS3中的盒模型有以下两种:标准盒模型、IE盒子模型(怪异盒模型),盒模型是由4个部分组成,由内向外分别是content(下图蓝色部分)、padding、border、margin盒模型有5......
  • @Mapper 与 @MapperScan 的区别
    之前一直用Mapper,后来项目中用MapperScan,再后来一不小心两个一起用了,就出现问题了,本文讲解两个注解的作用和优先级。1、@Mapper作用用在接口类上,在编译之后会生成相......
  • 生成式网络和判别式网络的区别
    生成式与判别式区别二者的区别主要就是由于一个是***联合概率分布P(x,y)***,另一个估计***条件概率分布P(y|x)***,而生成式模型能够根据贝叶斯公式得到判别式模型也是根据公......
  • Java中ConcurrentHashMap,HashMap和HashTable区别,通过ConcurrentHashMap对key进行加锁
    一、什么是ConcurrentHashMapConcurrentHashMap和HashMap一样,是一个存放键值对的容器。使用hash算法来获取值的地址,因此时间复杂度是O(1)。查询非常快。同时,ConcurrentHash......
  • TCP 与 UDP 的区别有哪些
    什么是TCPTCP(TransmissionControlProtocol传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议什么是UDPUDP(UserDatagramProtocol用户......
  • 回车与换行的区别
    1、两个控制字符的介绍以前打字机中,每行后面加两个表示结束的字符。一个叫做 “回车”return(/r),告诉打字机把打印头定位在左边界 ;另一个叫做 “换行”newline(/n),告诉打......
  • TPS和QPS 区别
    1、TPS:TransactionsPerSecond,意思是每秒事务数。一个事务是指客户端向服务器发送请求然后服务器做出反应的过程,具体的事务定义,可以是一个接口、多个接口、一个业务流程......