介绍

@Resource和@Autowired都是做bean的注入时使用,但其实@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要导入,但是Spring支持该注解的注入。

Spring不但支持自己定义的@Autowired注解,还支持由JSR-250规范定义的几个注解。如:@Resource、@PostConstruct 及 @PreDestroy

二者联系

  1. @Autowired和@Resource注解都是作为bean对象注入的时候使用的
  2. 两者都可以声明在字段和setter方法上

示例:

public class TestServiceImpl {// 下面两种@Autowired只要使用一种即可@Autowiredprivate UserDao userDao; // 用于字段上@Autowiredpublic void setUserDao(UserDao userDao) { // 用于属性的方法上this.userDao = userDao;}
}

注意:如果声明在字段上,那么就不需要再写setter方法。但是本质上,该对象还是作为set方法的实参,通过执行set方法注入,只是省略了setter方法罢了

二者区别

  1. @Autowired注解是Spring提供的,而@Resource注解是J2EE本身提供的
  2. @Autowird注解默认通过byType方式注入,而@Resource注解默认通过byName方式注入
  3. @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注解的区别相关推荐

  1. @Resource与@Autowired注解的区别

    一.写本博文的原因 年初刚加入到现在的项目时,在使用注解时我用的@Resource.后来,同事:你怎么使用@Resource注解?我:使用它有错吗?同事:没错,但是现在都使用@Autowired.我: ...

  2. @Resource和@Autowired作用和区别

    区别: 1,@Resource(JSR-250标准注解,推荐使用它来代替Spring专有的@Autowired注解) 2,Spring 不但支持自己定义的@Autowired注解,还支持几个由JSR- ...

  3. @Resource、@Autowired、@Qualifier区别与使用,以及bean name 的默认生成规则。

    文章目录 前言 一.注解区别 1. @Autowired 2. @Qualifier 3. @Resource 二.使用三个注解 三.bean name默认生成规则 前言 一.注解区别 1. @Aut ...

  4. SpringColoud学习笔记007---杂七杂八001--@Resource与@Autowired注解的区别

    一.写本博文的原因 年初刚加入到现在的项目时,在使用注解时我用的@Resource.后来,同事:你怎么使用@Resource注解?我:使用它有错吗?同事:没错,但是现在都使用@Autowired.我: ...

  5. Spring @Resource、@Autowired、@Qualifier区别

    @Resource默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入: @Autowired默认是按照类型装配注入的,如果想按照名称来转配注入,则需要结合@Qualif ...

  6. Spring5:@Autowired注解、@Resource注解和@Service注解

    转载:http://www.cnblogs.com/xrq730/p/5313412.html 什么是注解 传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有 ...

  7. @autowired注解注入为null_Java面试必备:依赖注入注解@Resource和@Autowired

    1. 前言 @Resource和@Autowired注解都可以在Spring Framework应用中进行声明式的依赖注入.而且面试中经常涉及到这两个注解的知识点.今天我们来总结一下它们. 2. @R ...

  8. Spring框架你敢写精通,面试官就敢问@Autowired注解的实现原理

    面试官:Spring框架中的@Autowired注解可以标注在哪些地方? 小小白:@Autowired注解可以被标注在构造函数.属性.setter方法或配置方法上,用于实现依赖自动注入. 面试官:有没 ...

  9. autowired注解_Spring系列之Spring常用注解总结

    作者:平凡希来源:https://www.cnblogs.com/xiaoxi/p/5935009.html 传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做 ...

  10. @Autowired注解

    @Autowired注解 @Autowired注解 @Autowired 字段 @Autowired 构造方法 @Autowired 方法 @Autowired与@Resource区别 @Autowi ...

最新文章

  1. CentOS下Redis安装配置小结
  2. linux php自动执行_linux下实现定时执行php脚本
  3. php常用函数、算法,PHP常用函数和常量
  4. HOWTO:将 IOCTL 发送到筛选器驱动程序
  5. new file会创建文件吗_Python处理文件—os模块
  6. Oracle递归查询,Oracle START WITH……CONNECT BY查询
  7. Ubuntu 配置环境变量
  8. 关于备考软考过程中历年真题的说明
  9. 基于SSM框架开发的社区疫情管理系统 附带详细运行指导视频
  10. 毕业设计任务书----基于Android的学生考勤管理系统设计与实现
  11. DIM-00014: 无法打开windows nt服务控制管理器
  12. C# QQ连连看外挂(内存版)源代码
  13. SmartGit同步更新本地仓库与远程仓库(origin)以及提交请求到forked过来的源仓库(upstream)
  14. java公路车的气嘴,5分钟了解自行车常见的三种气嘴
  15. 分享一则电子邮件营销案例
  16. 首次公开,用了三年的 pandas 速查表
  17. 如何将电脑上的音乐传到苹果手机上?电脑音乐导入苹果手机
  18. 双下巴的瘦脸运动方法 - 健康程序员,至尚生活!
  19. java点餐系统实验报告_JAVA课程实践报告 基于web的点餐系统毕业设计.doc
  20. ListView和CheckBox的混乱问题

热门文章

  1. 可汗学院公开课: 统计学 _0 基本数学知识梳理
  2. 计算机组成原理运算器设计实验之8位可控加减法电路设计
  3. linux根据文件名批量下载,Linux下多文件按照指定顺序批量解压和按照指定文件名更名...
  4. 【Nodejs】使用request批量下载MP3,文件数量内容都没问题
  5. ssh: connect to host master port 22: No route to host
  6. 进程管理软件SysCheck使用指南
  7. Android系统优化的那些年那些事
  8. matlab神经网络工具箱使用教程
  9. C语言刷题训练营-第一讲
  10. leaflet 常用方法总结