@Autowired和@Resource的区别

@Autowired和@Resource的区别

  • 1. 场景
  • 2. 定义
    • 2.1 @Autowired的类型优先
    • 2.1 @Resource的name优先
  • 3. 使用范围

1. 场景

spring进行声明式依赖注入的时候,经常使用的注解是@Autowired和@Resource。
那么他们两个有什么区别呢?

2. 定义

@Autowired是spring的注解,@Resource是JDKJSR-250规范的一个注解,spring对此注解进行了支持。

查找对应的bean的注入时,@Autowired的原则是"类型优先",@Resource的原则是"name优先"。

2.1 @Autowired的类型优先

(1)匹配内容

bean的类型,为:注入属性的类型。
bean的name为:@Qualifier指定名称(优先级高)>注入属性的名称(默认)

匹配优先级为:先根据注入bean的类型去查找bean。
-通过bean的类型,找到了唯一的bean则注入成功;
-如找不到此类型的bean,则报错;
-找到多个相同类型的bean,再通过bean的name去找。找到bean则返回,找不到,则报错。

(2)没有类型对应的bean的处理

如设置@Autowired(required = false),则不存在此bean的类型,则不抛出异常;否则如存现此类型的bean,则抛出异常。

需注意,这里的required = false,只有在bean的类型不存在的时候,有效。如果有bean的类型,但是通过name无法匹配,仍然抛出异常。

2.1 @Resource的name优先

(1)匹配内容

bean的类型,为:注入属性的类型(@Resource有type参数也可以指定,且优先级高)。
bean的name为:@Resource指定的name(优先级最高)>@Qualifier指定名称(优先级次高)>注入属性的名称(默认)

匹配优先级为:先根据bean的name去查找bean。

通过name,找到唯一的bean,且"bean的类型"和"注入属性的类型"一致,则注入成功

如通过name,找不到唯一的bean。

如name不是通过@Resource注解参数name指定(如果是@Resource或@Qualifier指定了name,则报错),是通过属性的name指定bean的名称,则会尝试根据注入属性的类型+属性的name去查找bean,之后的判定逻辑同@Autowired,即如下:

通过bean的类型,找到了唯一的bean则注入成功;
如找不到此类型的bean,则报错;
找到多个相同类型的bean,再通过bean的name去找。找到bean则返回,找不到,则报错。
(2)没有类型对应的bean的处理
抛出异常,报错

3. 使用范围

两者都可以用在成员属性和setter方法上

你可能感兴趣的:(沧海一粟,spring,java,mybatis)