相信对现在Java码农来说,@Autowired跟@Resource并不陌生,二者都可以自动注入,但是两者的区别很多时候并没有被注意到。

一、注解的出处

@Autowired是Spring提供的注解,需要导入包org.springframework.beans.factory.annotation.Autowired

@Resource是由J2EE提供的注解,需要导入包javax.annotation.Resource

也就是说@Autowired是外部包导入的,而@Resource是J2EE自己的

二、自动注入规则

@Autowired默认按照byType自动注入

  @Autowired采取的是按照类型进行自动注入的,Autowired源码中只有一个属性required(稍后介绍)。

  说明@Autowired无法人为去干预注入规则的,然后当容器中同一类型的bean存在多个的话,@Autowired该如何去选择呢,这时就需要@Qualifier注解来帮忙了。

  @Qualifier跟@Autowired来自同一包下,存在一个属性value,我们可以通过value属性来确定@Autowired具体注入的是哪一个bean。

  如果匹配不到对象时,将会抛出异常 BeanCreationException。

  如果匹配到多个对象时,也会抛出异常。

public class UserService {
@Autowired
@Qualifier(value="userDao1")
private UserDao userDao;
private ManDao manDao; @Autowired
public void setUserDao(@Qualifier("manDao") ManDao manDao) {
  this.manDao = manDao;
}
}

@Resource默认按照byName自动注入

  @Resource注解在注入规则上存在两个属性:name、type

    1、若没有使用属性,则通过反射机制,默认按照byName方式进行装配,如果没有匹配,则再类型进行装配;

    2、若只使用了name属性,则使用byName的自动注入策略,从上下文中查找名称id,如果匹配不到则抛出异常;

    3、若只使用了type属性,则使用byType自动注入策略,从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个都会抛出异常;

    4、若两个属性都使用了,则需要找到唯一匹配的bean进行装配,找不到则抛出异常。

public class UserService {
@Resource
private UserDao userDao;
@Resource(name="studentDao")
private StudentDao studentDao;
@Resource(type="TeacherDao")
private TeacherDao teacherDao;
@Resource(name="manDao",type="ManDao")
private ManDao manDao;
}

三、注入时对象是否存在

@Autowired:默认按照类型进行装配,默认情况下要求依赖的对象必须存在,如果需要允许null值,则需要设置required属性为false,@Autowired(required=false)。

@Resource:默认按照名称进行装配,允许为null。

四、使用位置

两者都可以写在字段和setter方法上,如果写在字段上,那么就不需要在写setter方法。

推荐使用@Resource注解在字段上,这样不仅不需要写setter方法了,而且由于@Resource属于J2EE,降低与spring的耦合。

@Autowired注解与@Resource注解的区别(详细)的更多相关文章

  1. Spring中@Autowired注解、@Resource注解的区别 (zz)

    Spring中@Autowired注解.@Resource注解的区别 Spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource.@ ...

  2. @Autowired注解与@resource注解的区别(十分详细)

    背景: 今天下班路上看到一个大货车,于是想到了装配,然后脑海里跳出了一个注解@Autowired(自动装配),于是又想到最近工作项目用的都是@Resource注解来进行装配.于是本着学什么东西都要一钻 ...

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

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

  4. 转:Spring中@Autowired注解、@Resource注解的区别

    Pay attention: When using these annotations, the object itself has to be created by Spring context. ...

  5. @Resource或者@Autowired作用/Spring中@Autowired注解、@Resource注解的区别

    @Resource或者@Autowired作用不用写set get就能注入,当然,前提是你已经开启了注解功能. spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定 ...

  6. @Autowired注解与@Resource注解的区别与用法

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

  7. spring--Springmvc中@Autowired注解与@Resource注解的区别

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

  8. Spring中 @Autowired注解与@Resource注解的区别

    Spring中 @Autowired注解与@Resource注解的区别在Spring 3.X中经常使用到@Autowired和@Resource进行装配.这两个注解的差异在何处???相同点:@Reso ...

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

    什么是注解 传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有两个缺点: 1.如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大:如果按需求分 ...

随机推荐

  1. 构造方法与setter方法

    上一个随笔提到了constructor-arg子标签,此随笔将会介绍一些类型的赋值方法 ①String类型.基本数据类型或其包装类都可以使用value标签属性赋值 String类型和基本类型的操作如下 ...

  2. spring boot 接口service有多个实现类

    接口.java public interface DeService { } 接口实现类1.java @Service("ud")public class DeServiceImp ...

  3. P1006 换个格式输出整数

    这道题相较于上一题来说就简单了许多.看题. 怎么感觉这道题有点类似P1002写出这个数.流程差不多,思路大致是先求出每一位上的数,然后根据 百十个 的顺序输出结果.题目比较简单,不做赘述,贴代码 代码 ...

  4. 032-PHP中关于数组排序的usort()函数

    <?php function re($a, $b) { return ($a < $b) ? 1 : -1; } $x = array(1, 3, 2, 5, 9); usort($x, ...

  5. 161-PHP 文本替换函数str_replace(二)

    <?php $str='Hello world!'; //定义源字符串 $search='o'; //定义将被替换的字符 $replace='O'; //定义替换的字符串 $res=str_re ...

  6. goroutine简介

    一.goroutine简介 Golang中最迷人的一个优点就是从语言层面就支持并发 在Golang中的goroutine(协程)类似于其他语言的线程 并发和并行 并行(parallelism)指不同的 ...

  7. MESI缓存一致性协议

    整理一下一些计算机的基础概念. 概念 MESI(Modified, Exclusive, Shared, Invalid) 也称 Illinois 协议, 由美帝UIUC(University of ...

  8. DRF源码-fields.py

    https://www.cnblogs.com/pyspark/p/8607801.html https://www.cnblogs.com/LYliangying/articles/9896548. ...

  9. springboot - 使用ErrorAttributes 在我们自定义的 ErrorController中

    1.概览 基于<springboot - 映射 /error 到自定义且实现了ErrorController的Controller>改造,仅将MyCustomErrorController ...

  10. 洛谷P1433 吃奶酪 题解 状态压缩DP

    题目链接:https://www.luogu.com.cn/problem/P1433 题目大意 房间里放着 \(n\) 块奶酪.一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在 \((0, ...