Autowired注解与Resource注解的区别_不平衡的叉叉树的博客-程序员秘密_autowired和resource注解的区别

技术标签: spring  后端框架  java  autowired 注解  resource 注解  

两者的用法

其实这两个注解的作用都一样,都是在做bean的注入,在使用过程中,两个注解有时候可以替换使用.

两者的共同点

  1. @Resource注解和@Autowired注解都可以用作bean的注入.
  2. 在接口只有一个实现类的时候,两个注解可以互相替换,效果相同.

两者的不同点

  1. @Resource注解是Java自身的注解,@Autowired注解是Spring的注解.
  2. @Resource注解有两个重要的属性,分别是name和type,如果name属性有值,则使用byName的自动注入策略,将值作为需要注入bean的名字,如果type有值,则使用byType自动注入策略,将值作为需要注入bean的类型.如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。即@Resource注解默认按照名称进行匹配,名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名,按照名称查找,当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。
  3. @Autowired注解是spring的注解,此注解只根据type进行注入,不会去匹配name.但是如果只根据type无法辨别注入对象时,就需要配合使用@Qualifier注解或者@Primary注解使用. 

案例

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bCP6b6Z54y_,size_17,color_FFFFFF,t_70,g_se,x_16

如上图所示,有一个UserService接口,同时创建了两个此接口的实现类,然后用UserController类来测试两个注解的不同用法. 注意如果接口只有一个实现类,就两个注解可以相互替换,效果相同.

1.只使用Autowired注解

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bCP6b6Z54y_,size_20,color_FFFFFF,t_70,g_se,x_16

可以明显看到报错信息,大概意思是说接口有超过两个实现类,不知道你要注入哪一个.

2.Autowired注解与Qualifier注解一起使用

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bCP6b6Z54y_,size_20,color_FFFFFF,t_70,g_se,x_16

你上面不是不知道我要注入哪一个bean嘛,我现在指定了bean的名字,你老老实实给我注入进来吧.

3.使用Resource注解,但未设置name属性

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bCP6b6Z54y_,size_20,color_FFFFFF,t_70,g_se,x_16

 

虽然此时不报错,但是启动之后控制台会有报错信息,关键信息如下:

Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'cn.tedu.sp01.service.UserService' available: expected single matching bean but found 2: userServiceImpl01,userServiceImpl02

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bCP6b6Z54y_,size_20,color_FFFFFF,t_70,g_se,x_16

 反正就是不能注入此类型的bean.

4.使用@Resource注解,并设置了name属性

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5bCP6b6Z54y_,size_20,color_FFFFFF,t_70,g_se,x_16

 启动之后,未有报错.

总结

如上面的例子,一个接口,俩个实现类,Autowired就不知道注入哪一个实现类(得与@Qualifier注解搭配使用才知道),而Resource有name属性,可以区分要注入哪一个实现类。

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/NoviceZ/article/details/120208241

智能推荐

从RGB色转为灰度色算法(转)_lq497028254的博客-程序员秘密_blue_gray = 3 * i(:,:,3) - i(:,:,1) - i(:,:,2);%

从RGB色转为灰度色算法(转)一、基础   对于彩色转灰度,有一个很著名的心理学公式:                          Gray = R*0.299 + G*0.587 + B*0.114二、整数算法  而实际应用时,希望避免低速的浮点运算,所以需要整数算法。  注意到系数都是3位精度的没有,我们可以将它们缩放1000倍来实现整数运算算法:                    ...

网站逆向分析-vue打包后的网站数据获取_Lidppp的博客-程序员秘密_vue的网站能扒么

目前来说网站开发主要有三种方向原生js或者jQueryvue,react,angular等框架WebAssemblywasm目前除了游戏引擎打包出来之外,我还没有见到其他的应用,所以暂时不讨论。原生js或者jQuery开发的网站使用原生js或者jQuery开发的网站,他们的数据挂挂载方式很简单,无非就两种:window上面的全局作用域不可在外部获取的函数作用域因为开发方式比较原始,所以这种网站的大部分都没有进行源码压缩,源码中甚至可以看到对应的注释,所以分析网站暴露出来的源码比较方

Android消息机制理解(Handler、Looper、MessageQueue)_a_dai_dai的博客-程序员秘密

最近变懒了,下班回家后都是葛优躺了,对代码的研究激情已经退却了很对,哎,这种状态已经跟条咸鱼无恙了,不好,得翻身了,好了言归正传,这两天看了下Android的消息机制,对这个有了一些自己的理解,就记下来做笔记吧。 做Android的同学对handler应该都不陌生,在开发中都不可避免的会遇到使用handler来协助处理一些耗时但又不能运行在主线程的任务(比如网络请求),但是当执行完这些操作后又必须

ARM 体系结构与编程 - Numeric local labels_Johhny Rade的博客-程序员秘密

参考资料https://developer.arm.com/documentation/100068/0616/Migrating-from-armasm-to-the-armclang-Integrated-Assembler/Numeric-local-labels?lang=en.global _start_start: MOV r4,#1 // r4=11: // Local label

项目启动报错:Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisExceptio_.玄之又玄.的博客-程序员秘密_can not get jedis connection nested exception is r

报错:`2020-02-12 14:13:02:414 [RMI TCP Connection(8)-127.0.0.1] ERROR: 初始化系统配置参数信息失败org.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; nested exception is red...

随便推点

android浏览器缓存,如何永久禁用Android浏览器缓存?_渴望手绘的伪设计的博客-程序员秘密

使用ADB命令可以清除浏览器缓存和用户数据adb shell pm clear com.android.browser,但如果你从Android程序运行看到发出此这是不行的我前面question关于那虽然这是临时解决方案,如果你需要清除android浏览器缓存连续使用后台运行服务它可以完成与“android.content.pm.IPackageDataObserver”。如果您寻找以下是该服务 ...

【C/C++】10个经典的C语言小程序,小白必看!_MAX在码字的博客-程序员秘密_c++小程序

  1、题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?  程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去掉不满足条件的排列。  程序源代码:  main()  {  int i,j,k;  printf("\n");  for(i=1;i<5;i++) /*以下为三重循环*/  for(j=1;j<5;j++)  for (k=1;k<5;k++)  {  if (i!=k&..

Caché数据库学习笔记(1)_weixin_34248258的博客-程序员秘密

目录:Caché的概念和基础知识Caché数据库的安装创建命名空间(namespace)和数据库(database)Documentation的使用========================================================================================================Caché的...

CSI简析(二)_氟西汀汀汀不喝奶茶的博客-程序员秘密

       在第一篇博客中,简单的介绍了一下什么是CSI,在这篇博客中,用matlab软件对采集到的CSI信息进行一下简单的解析。只需要将原始的CSI数据读取到一个元胞数组中,然后在命令行窗口中显示即可。                                  timestamp_low: NIC网卡1MHz时钟的低32位    bfee_count:驱动记录并发送到用户控件的波束测量...

大数据智能交通信号灯 城市道路Easy Go_智能交通技术的博客-程序员秘密

去年,人工智能棋手Alpha Go打败人类围棋世界冠军柯洁的新闻引发了大家对人工智能以及对人类社会发展带来深远影响的思考。今天,城市道路疏导专家“Easy Go”也将悄悄地改变我们的生活。...

没有混吃等死的工作,只有混吃等死的人_程序IT圈的博客-程序员秘密

本文来源于智先生授权发布 1 前几天,看到有一篇热文在抨击大学的学生会,观点新颖而独特。作者认为很多腐朽的官僚作风已经蔓延至学生会,自干事到主席形成了一套典型的权力语言体系。文中还提到,...

推荐文章

热门文章

相关标签