@Resource和@Autowired注解的区别
介绍
@Resource和@Autowired都是做bean的注入时使用,但其实@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要导入,但是Spring支持该注解的注入。
Spring不但支持自己定义的@Autowired注解,还支持由JSR-250规范定义的几个注解。如:@Resource、@PostConstruct 及 @PreDestroy
二者联系
- @Autowired和@Resource注解都是作为bean对象注入的时候使用的
- 两者都可以声明在字段和setter方法上
示例:
public class TestServiceImpl {// 下面两种@Autowired只要使用一种即可@Autowiredprivate UserDao userDao; // 用于字段上@Autowiredpublic void setUserDao(UserDao userDao) { // 用于属性的方法上this.userDao = userDao;}
}
注意:如果声明在字段上,那么就不需要再写setter方法。但是本质上,该对象还是作为set方法的实参,通过执行set方法注入,只是省略了setter方法罢了
二者区别
- @Autowired注解是Spring提供的,而@Resource注解是J2EE本身提供的
- @Autowird注解默认通过byType方式注入,而@Resource注解默认通过byName方式注入
- @Autowired注解注入的对象需要在IOC容器中存在,否则,需要加上属性 required=false,表示忽略当前要注入的bean,如果有直接注入,没有则跳过,不会报错
Spring中的byName与byType
简单介绍一下Spring中的byName与byType
byName就是变量名去匹配bean的id属性,而byType则是变量类型去匹配bean的class属性
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"/>
@Autowiredprivate UserDao userDao;
此处byName就是拿变量名 userDao 去匹配IOC容器中 id 为 userDao 的Bean;而byType就是拿变量类型 UserDao 去匹配IOC容器中 class 为 com.itheima.dao.impl.UserDaoImpl,因为UserDaoImpl是UserDao实现类,所以是匹配成功
@Autowird注解的使用
@Autowired实现:
注解驱动配置会向spring容器中注册AutowiredAnnotationBeanPostProcessor
当 Spring 容器启动时,AutowiredAnnotationBeanPostProcessor 将扫描 Spring 容器中所有 Bean,当发现 Bean 中拥有 @Autowired 注释时就找到和其匹配(默认按类型匹配)的 Bean,并注入到对应的地方中去。
步骤:@Autowird默认的注入方式为byType,也就是根据类型匹配,当有多个实现类时,则通过byName注入加以区分,或者可以通过配合@Qualifier注解来显式指定name值,指明要使用哪个具体的实现类
例子:
首先有一个接口 UserDao 和两个实现类 UserDaoImpl 和 UserDaoImpl2 ,并且这两个实现类已经加入到Spring的IOC容器中了,代码如下:
如果此时,我们的 service 层如下写法,代码会报错的,
原因:首先通过byType注入,结果发现 UserDao 类型有两个实现类,无法确定具体是哪一个,于是通过byName方式注入,@Autowired的byName注入方式的默认Bean就是类型后面的变量名,这里的变量名为 userDao,IOC容器中的Bean名称为userDao2 和 userDaoImpl2,所以匹配不到,于是报错。
解决方案:
方法一:
修改变量名,改为容器中存在的变量名
方法二:
配合@Qualifier注解来显式指定name值
@Resource注解的使用
@Resource 是JDK1.6支持的注解,由J2EE提供,需要导入包javax.annotation.Resource。默认按照名称进行装配,名称可以通过name属性进行指定。也提供按照byType 注入。
@Resource有两个重要的属性:name 和 type,而Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。
@Resource(name = "userDaoImpl2",type = UserDaoImpl.class)private UserDao userDao;
如果没有指定name属性,当注解写在字段上时,默认取字段名,按照名称查找。
当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找依赖对象。
当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。
示例:
public class TestServiceImpl {// 下面两种@Resource只要使用一种即可@Resource(name="userDao")private UserDao userDao; // 用于字段上@Resource(name="userDao")public void setUserDao(UserDao userDao) { // 用于属性的setter方法上this.userDao = userDao;}
}
@Resource装配顺序:
①如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。
②如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常。
③如果指定了type,则从上下文中查找类型匹配的bean进行装配,找不到或是找到多个,都会抛出异常。
④如果既没有指定name,又没有指定type,则自动按照byName方式进行装配,默认以变量名为Bean的id
总结
如果@Requied或者@Autowired写了set方法之上,则程序会走到set方法内部。但如果写在了field之上,则不会进入set方法当中。
@Autowire + @qualifier("") = @Resource(name="")
@Resource和@Autowired注解的区别相关推荐
- @Resource与@Autowired注解的区别
一.写本博文的原因 年初刚加入到现在的项目时,在使用注解时我用的@Resource.后来,同事:你怎么使用@Resource注解?我:使用它有错吗?同事:没错,但是现在都使用@Autowired.我: ...
- @Resource和@Autowired作用和区别
区别: 1,@Resource(JSR-250标准注解,推荐使用它来代替Spring专有的@Autowired注解) 2,Spring 不但支持自己定义的@Autowired注解,还支持几个由JSR- ...
- @Resource、@Autowired、@Qualifier区别与使用,以及bean name 的默认生成规则。
文章目录 前言 一.注解区别 1. @Autowired 2. @Qualifier 3. @Resource 二.使用三个注解 三.bean name默认生成规则 前言 一.注解区别 1. @Aut ...
- SpringColoud学习笔记007---杂七杂八001--@Resource与@Autowired注解的区别
一.写本博文的原因 年初刚加入到现在的项目时,在使用注解时我用的@Resource.后来,同事:你怎么使用@Resource注解?我:使用它有错吗?同事:没错,但是现在都使用@Autowired.我: ...
- Spring @Resource、@Autowired、@Qualifier区别
@Resource默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入: @Autowired默认是按照类型装配注入的,如果想按照名称来转配注入,则需要结合@Qualif ...
- Spring5:@Autowired注解、@Resource注解和@Service注解
转载:http://www.cnblogs.com/xrq730/p/5313412.html 什么是注解 传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有 ...
- @autowired注解注入为null_Java面试必备:依赖注入注解@Resource和@Autowired
1. 前言 @Resource和@Autowired注解都可以在Spring Framework应用中进行声明式的依赖注入.而且面试中经常涉及到这两个注解的知识点.今天我们来总结一下它们. 2. @R ...
- Spring框架你敢写精通,面试官就敢问@Autowired注解的实现原理
面试官:Spring框架中的@Autowired注解可以标注在哪些地方? 小小白:@Autowired注解可以被标注在构造函数.属性.setter方法或配置方法上,用于实现依赖自动注入. 面试官:有没 ...
- autowired注解_Spring系列之Spring常用注解总结
作者:平凡希来源:https://www.cnblogs.com/xiaoxi/p/5935009.html 传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做 ...
- @Autowired注解
@Autowired注解 @Autowired注解 @Autowired 字段 @Autowired 构造方法 @Autowired 方法 @Autowired与@Resource区别 @Autowi ...
最新文章
- CentOS下Redis安装配置小结
- linux php自动执行_linux下实现定时执行php脚本
- php常用函数、算法,PHP常用函数和常量
- HOWTO:将 IOCTL 发送到筛选器驱动程序
- new file会创建文件吗_Python处理文件—os模块
- Oracle递归查询,Oracle START WITH……CONNECT BY查询
- Ubuntu 配置环境变量
- 关于备考软考过程中历年真题的说明
- 基于SSM框架开发的社区疫情管理系统 附带详细运行指导视频
- 毕业设计任务书----基于Android的学生考勤管理系统设计与实现
- DIM-00014: 无法打开windows nt服务控制管理器
- C# QQ连连看外挂(内存版)源代码
- SmartGit同步更新本地仓库与远程仓库(origin)以及提交请求到forked过来的源仓库(upstream)
- java公路车的气嘴,5分钟了解自行车常见的三种气嘴
- 分享一则电子邮件营销案例
- 首次公开,用了三年的 pandas 速查表
- 如何将电脑上的音乐传到苹果手机上?电脑音乐导入苹果手机
- 双下巴的瘦脸运动方法 - 健康程序员,至尚生活!
- java点餐系统实验报告_JAVA课程实践报告 基于web的点餐系统毕业设计.doc
- ListView和CheckBox的混乱问题
热门文章
- 可汗学院公开课: 统计学 _0 基本数学知识梳理
- 计算机组成原理运算器设计实验之8位可控加减法电路设计
- linux根据文件名批量下载,Linux下多文件按照指定顺序批量解压和按照指定文件名更名...
- 【Nodejs】使用request批量下载MP3,文件数量内容都没问题
- ssh: connect to host master port 22: No route to host
- 进程管理软件SysCheck使用指南
- Android系统优化的那些年那些事
- matlab神经网络工具箱使用教程
- C语言刷题训练营-第一讲
- leaflet 常用方法总结