Spring中@Autowired和@Resource的区别

一、定义

  • @Autowired

对类成员变量、方法及构造函数进行标注,完成自动装配的工作。

  • @Resource

在语义上被定义为通过其唯一的名称来标识特定的目标组件,其中声明的类型与匹配过程无关。

如果没有明确指定名称,则默认名称是从字段名称或设置方法(get、set方法)派生的。 如果用在字段上,则采用字段名称; 如果用在在setter方法,它采用其属性名称(例如setProperty()方法,取property做为属性名称)。

二、区别

在Spring框架中,如果在Service层中需要注入其他依赖的对象,通常我们都会使用@Autowired或者@Resource注解,但是它们是有区别的,比如@Autowired跟Spring框架强耦合了, 如果换成其他框架,@Autowired就没作用了。而@Resource是JSR-250提供的,它是Java标准,绝大部分框架都支持。

接下来,我们总结一下@Autowired和@Resource的区别:

(一)、包含的属性不同

@Autowired只包含一个参数:required,表示是否开启自动注入,默认是true。而@Resource包含七个参数,其中最重要的两个参数是:name 和 type。如下:

public @interface Autowired {/*** 是否开启自动注入,有些时候我们不想使用自动装配功能,可以将该参数设置成false。*/boolean required() default true;}public @interface Resource {/*** bean的名称*/String name() default "";String lookup() default "";/*** Java类,被解析为bean的类型*/Class<?> type() default java.lang.Object.class;enum AuthenticationType {CONTAINER,APPLICATION}/*** 身份验证类型*/AuthenticationType authenticationType() default AuthenticationType.CONTAINER;/*** 组件是否可以与其他组件之间共享*/boolean shareable() default true;String mappedName() default "";/*** 描述*/String description() default "";
}

(二)、@Autowired默认按byType自动装配,而@Resource默认byName自动装配

@Autowired如果要使用byName,需要使用@Qualifier一起配合。而@Resource如果指定了name,则用byName自动装配,如果指定了type,则用byType自动装配。

(三)、注解应用的地方不同

@Autowired能够用在:构造器、方法、参数、成员变量和注解上,而@Resource能用在:类、成员变量和方法上。

(四)、出处不同

@Autowired是Spring定义的注解,而@Resource是JSR-250定义的注解。所以@Autowired只能在Spring框架下使用,而@Resource则可以与其他框架一起使用。

(五)、装配顺序不同

@Autowired的装配顺序如下:

@Autowired默认先按byType进行匹配,如果发现找到多个bean,则又按照byName方式进行匹配,如果还有多个,则报出异常。

img

@Resource的装配顺序如下:

  • 如果同时指定了name和type,流程如下:

img

  • 如果指定了name,流程如下:

只是指定了@Resource注解的name,则按name后的名字去bean元素里查找有与之相等的name属性的bean。

img

  • 如果指定了type,流程如下:

只指定@Resource注解的type属性,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常。

img

  • 如果既没有指定name,也没有指定type,流程如下:

既不指定name属性,也不指定type属性,则自动按byName方式进行查找。如果没有找到符合的bean,则回退为一个原始类型进行进行查找,如果找到就注入。

img

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/557005.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全国计算机考试真考题库4,全国计算机等级考试无纸化真考题库试卷二级C--(4)资料.docx...

精品文档精品文档PAGEPAGE #欢迎下载全国计算机等级考试无纸化真考题库试卷(4)二级 C(考试时间120分钟&#xff0c;满分100分)一、选择题(每小题1分&#xff0c;共40分)(1)下列数据结构中&#xff0c;属于非线性结构的是()。A)循环队列B)带链队列C)二叉树D)带链栈⑵下列数据结构…

Java面试题大全

一、Java 基础 1. JDK 和 JRE 有什么区别&#xff1f; JDK&#xff1a;Java Development Kit 的简称&#xff0c;java 开发工具包&#xff0c;提供了 java 的开发环境和运行环境。JRE&#xff1a;Java Runtime Environment 的简称&#xff0c;java 运行环境&#xff0c;为 ja…

每个计算机系的学生都学离散数学,离散数学一阶逻辑精要.ppt

离散数学一阶逻辑精要.ppt2.谓词公式 中量词 的辖域是( ). A. B. C. D. 3.谓词公式 中变元 是( ). A. 自由变元 B. 约束变元 C. 既不是自由变元也不是约束变元 D. 既是自由变元也是约束变元 4.若个体域为整数域&#xff0c;下列公式中真值为1的是 ( ). A. B. C. D. 5. 设A(x):x…

压力测试软件je,Jemeter压力测试工具

![JMeter](https://img.tnblog.net/arcimg/hb/fcfd7c903b184e5e9db56360fed8c7a7.png "JMeter")>#Jemeter 压力测试工具[TOC]JMeter 简介------------>阿帕奇JMeter的?应用程序是开源软件&#xff0c;100&#xff05;纯Java应用而设计的负载测试功能行为和测量…

Java面试题整理(附参考答案)

1、面向对象的特征有哪些方面&#xff1f; 抽象&#xff1a;将同类对象的共同特征提取出来构造类。继承&#xff1a;基于基类创建新类。封装&#xff1a;将数据隐藏起来&#xff0c;对数据的访问只能通过特定接口。多态性&#xff1a;不同子类型对象对相同消息作出不同响应。 …

沈阳药科大学计算机二级好考吗,沈阳药科大学考研难吗?一般要什么水平才可以进入?...

沈阳药科大学考考研难吗&#xff1f;其实并不能一概而论。要看我们每个学生的实际情况。例如&#xff1a;本科院校是哪个层级的&#xff0c;专业考取是否为跨专业&#xff1f;专业是否是热门学科&#xff1f;学校分数线是多少&#xff1f;历年录取人数是多少&#xff1f;接下来…

SpringMVC源码之参数解析绑定原理

SpringMVC源码之参数解析绑定原理 摘要 本文从源码层面简单讲解SpringMVC的参数绑定原理 SpringMVC参数绑定相关组件的初始化过程 在理解初始化之前&#xff0c;先来认识一个接口 HandlerMethodArgumentResolver 方法参数解析器接口&#xff0c;这个接口是SpringMVC参数解…

win7 找不到 计算机策略组,win7打开组策略报错:找不到资源string.Advanced_EnableSSL3Fallback...

今天要在组策略里关闭几个端口&#xff0c;每次打开组策略时都弹出一个错误提示框&#xff0c;说是找不到资源“string.Advanced_EnableSSL3Fallback”。找不到资源string.Advanced_EnableSSL3Fallback我的系统好好的&#xff0c;怎么会这样呢&#xff1f;一时间不知如何解决。…

@RequestParam 注解原理

RequestParam 注解原理 注&#xff1a;SpringMVC 版本 5.2.15 介绍 RequestParam 注解用于绑定请求参数。它的具体内容如下&#xff1a; // 该注解作用的方法形参 Target(ElementType.PARAMETER) Retention(RetentionPolicy.RUNTIME) Documented public interface RequestPar…

xbox虚拟服务器,Xbox One平台真相:原生Win8/虚拟化运行

Xbox One搭载的是Windows8吗&#xff1f;没错。在Build2014开发者大会上&#xff0c;Frank Savage介绍Xbox One平台未来的开发计划&#xff0c;其中他也揭秘Xbox One平台运行原生Win8系统&#xff0c;那些主机游戏均采用虚拟化技术加载运行。据国外wccftech科技网站透露&#x…

SpringMVC 执行流程解析

SpringMVC 执行流程解析 注&#xff1a;SpringMVC 版本 5.2.15 上面这张图许多人都看过&#xff0c;本文试图从源码的角度带大家分析一下该过程。 1. ContextLoaderListener 首先我们从 ContextLoaderListener 讲起&#xff0c;它继承自 ServletContextListener&#xff0c;用…

无线网服务器mac是什么,电脑MAC和LAN MAC以及WIRELESS MAC是什么关系?

满意答案刘义芳aaa推荐于 2017.12.14采纳率&#xff1a;51% 等级&#xff1a;12已帮助&#xff1a;19753人一楼和二楼的回答都是对的电脑MAC这样说不好理解的&#xff0c;应该说MAC电脑&#xff0c;MAC是Macintosh这个的前三个字母&#xff0c;至于它为什么只用前三个字母做…

mybatis 中 foreach collection的三种用法

foreach的主要用在构建in条件中&#xff0c;它可以在SQL语句中进行迭代一个集合。 foreach元素的属性主要有 item&#xff0c;index&#xff0c;collection&#xff0c;open&#xff0c;separator&#xff0c;close。 item表示集合中每一个元素进行迭代时的别名&#xff0c;i…

@RequestParam详解

RequestParam 主要用于将请求参数区域的数据映射到控制层方法的参数上 首先我们需要知道RequestParam注解主要有哪些参数 value&#xff1a;请求中传入参数的名称&#xff0c;如果不设置后台接口的value值&#xff0c;则会默认为该变量名。比如上图中第一个参数如果不设置va…

Java new关键字和newInstance()方法的区别

1、类的加载方式不同 在执行Class.forName(“a.class.Name”)时&#xff0c;JVM会在classapth中去找对应的类并加载&#xff0c;这时JVM会执行该类的静态代码段。在使用newInstance()方法的时候&#xff0c;必须保证这个类已经加载并且已经连接了&#xff0c;而这可以通过Clas…

springboot 的 RedisTemplate 的 execute 和 executePipelined 功能的区别redis

1.executespring 如下是 springboot 官网原文:springboot Redis provides support for transactions through the multi, exec, and discard commands. These operations are available on RedisTemplate, however RedisTemplate is not guaranteed to execute all operatio…

Error running ‘Tomcat‘: Unable to open debugger port (127.0.0.1:2148): java.net.SocketExceptio

在Web项目运行的时候&#xff0c;IDEA可能会报Error running ‘Tomcat’: Unable to open debugger port (127.0.0.1:2148): java.net.SocketException “socket closed”错误&#xff0c;启动不了Tomcat&#xff0c;在这种时候&#xff0c;网上的解决办法大多都是修改端口的这…

# hive打不开,提示节点过少,进入安全模式~~

hive打不开,提示节点过少&#xff0c;进入安全模式~~ 前段时候给电及除尘&#xff0c;因为经常拆着玩&#xff0c;越熟练越容易大意&#xff0c;一下子把电源排线扯坏了。挼了挼&#xff0c;想凑和着用吧&#xff0c;没想到不知怎么的就会关机&#xff0c;太频繁了。一怒之下取…

Java 枚举(enum) 详解7种常见的用法

JDK1.5引入了新的类型——枚举。在 Java 中它虽然算个“小”功能&#xff0c;却给我的开发带来了“大”方便。 用法一&#xff1a;常量 在JDK1.5 之前&#xff0c;我们定义常量都是&#xff1a; public static fianl… 。现在好了&#xff0c;有了枚举&#xff0c;可以把相关…

sqoop导入hive时间格式问题解决方案

sqoop导入hive时间格式问题解决方案 从mysql导入数据时,发现时间格式有问题,要么是时间后面多一位零,要么要使用时间戳,还能不能好好玩耍了?! 于是,我就逛论坛&#xff0c;找大神&#xff0c;最终无果&#xff0c;也许这个问题过于简单吧&#xff0c;居然没有大牛讨论。想了好…