spring中比较容易混淆的是Resource和Autowired,特此做下区分。

Resource:j2ee的注解,默认以byName的方式去匹配与属性名相同的bean的id,如果没有找到就会以byType的方式查找,如果byType查找到多个的话,使用@Qualifier注解(spring注解)指定某个具体名称的bean。

Autowired:spring注解,默认是以byType的方式去匹配类型相同的bean,如果只匹配到一个,那么就直接注入该bean,无论要注入的 bean 的 name 是什么;如果匹配到多个,就会调用 DefaultListableBeanFactory 的 determineAutowireCandidate 方法来决定具体注入哪个bean。

determineAutowireCandidate 方法的逻辑是:1

2

3先找 Bean 上有@Primary 注解的,有则直接返回 bean 的 name。

再找 Bean 上有 @Order,@PriorityOrder 注解的,有则返回 bean 的 name。

最后再以名称匹配(ByName)的方式去查找相匹配的 bean。

可以简单的理解为先以 ByType 的方式去匹配,如果匹配到了多个再以 ByName 的方式去匹配,找到了对应的 bean 就去注入,没找到就抛出异常。1还有一点要注意:如果使用了 @Qualifier 注解,那么当自动装配匹配到多个 bean 的时候就不会进入 determineAutowireCandidate 方法(亲测),而是直接查找与 @Qualifer 指定的 bean name 相同的 bean 去注入,找到了就直接注入,没有找到则抛出异常。

@Autowired与@Resource异同:1

2

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

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

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

它们的作用相同都是用注解方式注入对象,但执行顺序不同。@Autowired先byType,@Resource先byName。

问题:Spring的@Autowired加到接口上但获取的是实现类?1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20/* 类 @Controller注解,会在spring容器中实例化对象 */

@Controller

public class UserContoller{

@Autowired// 先按类型找,然后按id为属性名去找

private UserService userService;

//为什么他会拿到userServiceImpl?

// @Autowired会帮你按UserService的类型去容器中找唯一bean对象

// 1、容器没有该类型的对象:报错

// 2、容器中有该类型的唯一bean对象,就将该唯一bean对象赋值给该属性

///3、容器中有多个【两个及以上】该类型的唯一bean对象,

// 它会再根据该属性名去容器中找,

// 看看容器中的哪个bean对象的id值和该属性名一致,

// 如果有,就将容器中该对象赋值给该属性,如果没有报错。

}

/* 接口 */

public interface UserService{}

/* 类 @Service注解,会在spring容器中实例化对象 */

@Service

public class UserServiceImpl implements UserService{}

@Autowired先按类型找,然后再按id为属性名去找

他会帮你按UserService的类型去容器中找唯一bean对象

容器没有该类型的对象:报错

容器中有该类型的唯一bean对象,就将该唯一bean对象赋值给该属性

容器中有多个【两个及以上】该类型的唯一bean对象,

它会再根据该属性名去容器中找,

看看容器中的哪个bean对象的id值和该属性名一致,

如果有,就将容器中该对象赋值给该属性,如果没有报错。

然后通过多态的向上转型就赋值成功。等价于之前手动赋值1UserService userService = new UserServiceImpl();

问题:同一类型拥有多个实现类的时候,如何注入呢?

答:这种场景下,只能通过 byName 注入的方式。可以使用 @Resource 或 @Qualifier 注解。

问题:如果没有指定Spring创建的bean的名称,会怎么注入呢?

(1)默认名为类名,但首字母小写,如:UserService类,创建的bean的name为userService

(2)如果类名前两个或以上字母都为大写,那么bean的名字就是类名,如:TUserService类,默认创建的bean的name为TUserService

@Required 注释应用于 bean 属性的 setter 方法,它表明受影响的 bean 属性在配置时必须放在 XML 配置文件中,否则容器就会抛出一个 BeanInitializationException 异常

java resource和,java_spring之Autowired与Resource差异解析相关推荐

  1. Java面试--autowired和resource区别

    面试题:autowired和resource有什么区别(百度面试题) autowired和resource有什么区别 @Resource默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会 ...

  2. Java 中 @Autowired与@Resource的区别

    1.@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上.  2.@Autowired默认按类型装配(这个注解是属业spring的),默认情况下 ...

  3. Spring注解@Component、@Repository、@Service、@Controller,@Autowired、@Resource用法

    一.Spring定义bean,@Component.@Repository.@Service 和 @Controller Spring 2.5 中除了提供 @Component 注释外,还定义了几个拥 ...

  4. Spring中@Autowired和@Resource区别

    Spring可以基于注解方式配置并注入依赖.在Java代码中使用@Resource或者@Autowired注解方式注入. 1. @Resource: 1)默认按照名称装配注入,只有当找不到与名称nam ...

  5. 在方法的形参位置使用@Qualifier注解||@Autowired 与@Resource的区别

    实验21:在方法的形参位置使用@Qualifier注解 实验22:@Autowired注解的required属性指定某个属性允许不被设置 @Autowired   @Resource  @Inject ...

  6. 【Spring注解系列13】Spring自动装配总结:@Autowired、@Resource、@Qualifier、@Inject

    目录 1.@Autowired.@Resource.@Qualifier.@Inject 1).@Autowired 2).@Resource与@Inject 3). @Autowired参数取值 2 ...

  7. @Autowired和@Resource注解的区别?

    谈到Spring的注解,@Autowired和@resource这两个注解不得不提.@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上 那@A ...

  8. Spring系列(十):@Autowired 和@Resource注解用法介绍

    今天给大家分享Spring属性注入的注解@Autowired 和@Resource介,希望对大家能有所帮助! 一.@Autowired 注解 1.1 介绍 @Autowired注解默认按照类型容器中找 ...

  9. Spring中@Autowired和@Resource的区别

    一.定义 @Autowired 对类成员变量.方法及构造函数进行标注,完成自动装配的工作. @Resource 在语义上被定义为通过其唯一的名称来标识特定的目标组件,其中声明的类型与匹配过程无关. 如 ...

最新文章

  1. 宇宙是一个图网络?「全球最聪明的人」刚刚为物理基础理论指出了全新道路...
  2. [Android] DiffUtil在RecyclerView中的使用详解
  3. python处理excel的工具-基于Python的Excel处理工具
  4. Mdadm 设置管理
  5. 使用Ubuntu 12.04作为日常电脑环境
  6. 加州无人车报告出炉,苹果表现垫底,国产车进前五
  7. CentOS6中安装、配置、启动GitLab以及遇到的那些坑
  8. 基于SuperSocket的IIS主动推送消息给android客户端
  9. LeetCode-260 Single Number III
  10. 集合框架(去除ArrayList集合中的重复字符串元素案例2)
  11. python中定义的类的方法调用老出现missing 1 postional argument 或者self的解决办法
  12. 设计模式——装饰模式和代理模式
  13. ENVI计算不同轨道号范围中的平均高程
  14. fprintf用法解析
  15. 实验六 卷积神经网络(4)ResNet18实现MNIST
  16. 24券创始人杜一楠的失败检讨书:我的“孩子”是如何死去的?
  17. 全美 计算机专业排名,全美计算机专业排名
  18. EasyExcel锁定指定单元格 禁止表格复制
  19. 实现SSO单点登录的思考
  20. MATLAB读json文件

热门文章

  1. 你正在学 Web 自动化测试?Selenium 基本操作你了解嘛? | 原力计划
  2. 半小时训练亿级规模知识图谱,亚马逊这个 AI 框架要火!
  3. 李彦宏:百度今年全员涨薪,比去年还多;谷歌暂停Chrome浏览器更新;Eclipse 4.15发布 | 极客头条...
  4. 终于!孙宇晨和巴菲特吃上 3153 万元的晚餐,还送了一个比特币!
  5. 如何降低前端代码圈复杂度?
  6. 乔纳森离开苹果;李彦宏被泼水;Windows 公开 Linux 内核源代码 | 开发者周刊
  7. @程序员,2019 年软件开发新趋势必知!
  8. 5G 登上“神坛”,区块链裁员求生!
  9. 女神节 | 那些奋斗在 IT 领域的“女神”们
  10. 日本要向中国收二维码使用费?每人一分钱?