当前位置: 首页 > news >正文

Spring中@Autowired注解、@Resource注解的区别

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

        Spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource、@PostConstruct以及@PreDestroy。

  @Resource的作用相当于@Autowired,只不过@Autowired按byType(类型注入)自动注入,而@Resource默认按 byName(名称注入)自动注入罢了。@Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。

@Resource装配顺序
  1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
  2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
  3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常

  4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;

@Autowired 与@Resource的区别:

1、 @Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上。

2、 @Autowired默认按类型装配(这个注解是属业spring的),默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,如:@Autowired(required=false) ,如果我们想使用名称装配可以结合@Qualifier注解进行使用,如下:

@Autowired()
@Qualifier("baseDao")
private BaseDao baseDao;

3、@Resource(这个注解属于J2EE的),默认安装名称进行装配,名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名进行安装名称查找,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。

@Resource(name="baseDao")
private BaseDao baseDao;

推荐使用:@Resource注解在字段上,这样就不用写setter方法了,并且这个注解是属于J2EE的,减少了与spring的耦合。这样代码看起就比较优雅。

转载于:https://my.oschina.net/Tsher2015/blog/616865

相关文章:

  • jquery easyui的datagrid在初始化的时候会请求两次URL?
  • KBEngine 服务器端-loginapp-协议构建、解析执行
  • android 三级菜单 BaseExpandableListAdapter
  • [linux]linux命令学习-netstat
  • 内容观察者
  • iOS学习笔记19-抽屉MMDrawerController使用
  • thrift 远程服务调用 简单示例
  • 中国移动短信网关错误代码汇总(完整版)
  • 编译安装 apache+mysql+php 详细步骤
  • OC基础--常用类的初步介绍与简单实用之NSString
  • iOS UIViewController生命周期控制
  • Java 异常处理的 9 个最佳实践
  • Linux运维工程师面试题第九套
  • js判断是否是用微信浏览器打开
  • 147. Insertion Sort List
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • 4个实用的微服务测试策略
  • android 一些 utils
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • es6(二):字符串的扩展
  • JavaScript 奇技淫巧
  • Java应用性能调优
  • Linux CTF 逆向入门
  • MySQL用户中的%到底包不包括localhost?
  • SpriteKit 技巧之添加背景图片
  • Vue 重置组件到初始状态
  • 不上全站https的网站你们就等着被恶心死吧
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 微信开放平台全网发布【失败】的几点排查方法
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 异常机制详解
  • 应用生命周期终极 DevOps 工具包
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • raise 与 raise ... from 的区别
  • #laravel 通过手动安装依赖PHPExcel#
  • (1)(1.13) SiK无线电高级配置(五)
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (145)光线追踪距离场柔和阴影
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (二)学习JVM —— 垃圾回收机制
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (四)鸿鹄云架构一服务注册中心
  • (转)setTimeout 和 setInterval 的区别
  • *** 2003
  • *Django中的Ajax 纯js的书写样式1
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...
  • @Autowired和@Resource装配
  • @entity 不限字节长度的类型_一文读懂Redis常见对象类型的底层数据结构
  • [boost]使用boost::function和boost::bind产生的down机一例
  • [c++] 自写 MyString 类
  • [CSS] 点击事件触发的动画
  • [HNOI2008]Cards
  • [HXPCTF 2021]includer‘s revenge