博客
关于我
@Autowired和@Resource的区别
阅读量:796 次
发布时间:2023-03-23

本文共 1210 字,大约阅读时间需要 4 分钟。

@Autowired和@Resource是Spring和JDK中两种常用的注解,它们在依赖注入方面有着不同的特点和使用场景。本文将从两者的区别、默认装配方式以及装配顺序等方面进行详细分析。

首先,@Autowired是Spring支持的注解,默认是按类型进行依赖装配。如果需要,可以通过设置required属性为false来允许依赖对象为null。此外,@Autowired还支持结合@Qualifier注解来按名称装配,例如@Autowired(required=false) @Qualifier("personDaoBean")。

相比之下,@Resource是JDK支持的注解,默认是按名称进行依赖装配。如果未指定name属性,默认会根据注解标注的位置(字段或setter方法)来获取bean名称。需要注意的是,@Resource注解的装配顺序与@Autowired略有不同:

  • 如果同时指定了name和type属性,Spring会从上下文中找到唯一匹配的bean进行装配,找不到则会抛出异常。
  • 如果只指定了name属性,Spring会根据名称从上下文中查找匹配的bean,找不到则抛出异常。
  • 如果只指定了type属性,Spring会从上下文中找到类型匹配的唯一bean进行装配,找不到或找到多个都会抛出异常。
  • 如果既没有指定name,又没有指定type,Spring会按照byName方式进行装配。如果没有匹配的bean,则会回退为byType匹配,如果仍然没有匹配,最后会使用原始类型进行匹配。
  • 再来看两者的默认装配方式:

    • @Autowired默认是按类型装配。
    • @Resource默认是按名称装配。

    在实际应用中,建议根据项目需求选择合适的注解。如果需要按名称装配,可以结合@Qualifier注解使用。例如:

    @Repository
    public class MyService {
    @Autowired
    private MyBean bean;
    }

    或者:

    @Repository
    public class MyService {
    @Resource(name = "myBean")
    private MyBean bean;
    }

    需要注意的是,对于@Resource注解的使用,如果注解标注在字段上且未指定name属性,默认会取字段名作为bean名称寻找依赖对象;如果注解标注在setter方法上且未指定name属性,默认会取属性名作为bean名称寻找依赖对象。如果没有指定name属性,并且按照默认的名称仍找不到依赖对象时,会按类型匹配。但只要指定了name属性,就只能按名称装配了。

    总的来说,@Autowired和@Resource都是非常强大的依赖注入工具,选择哪一个取决于你的项目需求和具体场景。在实际开发中,建议根据项目的技术栈和应用场景进行合理的组合使用。

    转载地址:http://oaqfk.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现矩阵螺旋打印算法(附完整源码)
    查看>>
    Objective-C实现矩阵转置(附完整源码)
    查看>>