欢迎光临
我们一直在努力

SpringIoC & DI(5):DI详解

SpringIoC & DI(5):DI详解

文章目录

  • SpringIoC & DI(5):DI详解
    • 观前提醒
  • 1. @Autowired 存在的问题
    • 解决方法(三个):
      • 第一种:@Primary
      • 第二种:@Qualifier
        • 另一个使用场景:
      • 第三种:@Resource
    • 总结:
  • 2. @Resource 和 @Autowired 的区别(高频面试题)
  • 3.总结:

观前提醒

这篇博客的代码,是比较简单的。 你自己可以创建类,使用注解,调用对象,就能够看见效果。

或者,你获取我的源码: https://gitee.com/mrbgvhbhjv/java-ee-course/tree/master/%E5%90%8E%E7%AB%AF%E4%BB%A3%E7%A0%81/SpringIoC_demo_20251025

1. @Autowired 存在的问题

@Autowired 这个注解,是根据 类的类型 去寻找对象的。 在这里插入图片描述

这种方式,和我们 使用 根据对象的类型,获取 Bean 的代码一样,有缺点: 当同个类型的对象,有多个的时候,就会报错。

例如:有多个 Student类型 的对象,使用 @Autowired 进行依赖注入,会失败: 在这里插入图片描述

解决方法(三个):

解决方法有三个:

  • @Primary(确定对象的最高优先级)
  • @Qualifier(结合 @Autowired 根据 Bean的名称 获取对象)
  • @Resource(非 Spring 的注解)
  • 第一种:@Primary

    通过 @Primary,用于多个类型的某一个对象上,确定这个对象,在依赖注入时的最高优先级。 依赖注入时,优先注入被 @Primary 标记的对象。 在这里插入图片描述 在这里插入图片描述

    第二种:@Qualifier

    @Qualifier:结合 @Autowired, 根据 Bean的名称 获取对象 @Autowired:根据对象的类型来获取 @Qualifier + @Autowired:根据 Bean的名称获取 Bean

    在这里插入图片描述

    另一个使用场景:

    @Bean + @Qualifier,确定方法参数中,使用的 类型。 在这里插入图片描述

    第三种:@Resource

    @Resource,这个注解,是由 JDK 提供的依赖注入的 注解。 它的作用等同于:@Qualifier + @Autowired 在这里插入图片描述 @Resource,这个注解,它编写的时候,没有默认的属性 value,所以,我们需要手动加上 name = "Bean的名称"。

    总结:

    更多的时候,解决 多个相同类型的对象的依赖注入问题,我们使用的是:@Resource 或者 @Qualifier + @Autowired

    @Primary,几乎不用。

    2. @Resource 和 @Autowired 的区别(高频面试题)

    @Autowird 与 @Resource的区别

    • @Autowired 是 Spring框架 提供的注解,而@Resource是JDK提供的注解

    • @Autowired 默认是按照类型注入,而@Resource是按照名称注入。

      相比于 @Autowired 来说,@Resource 支持更多的参数设置,例如 name 设置,根据名称获取 Bean。

    @Autowired 默认是按照类型注入,而@Resource是按照名称注入。这句话,并不严谨,但是,上述回答,面试官喜欢听。 讲完之后,还需要讲解,为什么不严谨。

    @Resource :类型 + 名称 进行依赖注入 @Autowired:类型 进行依赖注入 所以,建议回答的时候,再添加一个条件:同一个类的情况下,@Autowired 默认是按照类型注入,而@Resource是按照名称注入。

    @Autowired 虽说是按照 类型 进行依赖注入,但是,它赋值时的那个变量名,是有影响的: 在这里插入图片描述 在这里插入图片描述 但是,实际开发中,我们并不会这么干,因为这样的写法,很容易出现 bug,还是要严格按照 接口文档描述的来写代码。

    这种情况的发生,和 Autowired注解 的装配顺序有关: 在这里插入图片描述

    Autowired注解 的装配顺序(优先级):

  • 首先:根据类型查找

  • 然后:根据 @Qualifier 定义的名称查找(写有 @Qualifier 的情况下,不会在再往下查找了)

  • 最后:

    3.1 没有 写上@Qualifier 的情况下:根据赋值的那个 引用变量的名称 进行查找

    3.2 写有 @Qualifier 的情况下, 不会 根据赋值的那个 引用变量的名称 进行查找

  • 都找不到,无法 依赖注入,就会报错。

    3.总结:

    有多个 相同类型(例如:多个 Student类型 ) 的对象,使用 @Autowired 进行依赖注入,会失败。 解决方法有三个:

  • @Primary(确定对象的最高优先级)
  • @Qualifier(结合 @Autowired 根据 Bean的名称 获取对象)
  • @Resource(非 Spring 的注解)
  • 更多的时候,解决 多个相同类型的对象的依赖注入问题,我们使用的是:@Resource 或者 @Qualifier + @Autowired @Primary,几乎不用。

    @Resource 和 @Autowired 的区别(高频面试题):

    • @Autowired 是 Spring框架 提供的注解,而@Resource是JDK提供的注解

    • @Autowired 默认是按照类型注入,而@Resource是按照名称注入。

      相比于 @Autowired 来说,@Resource 支持更多的参数设置,例如 name 设置,根据名称获取 Bean。

    最后,如果这篇博客能帮到你的,请你点点赞,有写错了,写的不好的,欢迎评论指出,谢谢! 下一篇博客:SpringIoC & DI(6):SpringIoC & DI总结总结

    赞(0)
    未经允许不得转载:171主机测评 » SpringIoC & DI(5):DI详解
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址