@Resource与@Autowire

@Resource与@Autowired都是Java中用于依赖注入的注解,它们在Spring/Spring Boot项目中有着广泛的应用。以下是对这两个注解的详细解析:

一、@Resource注解

  1. 来源

    • @Resource是Java EE(Jakarta EE)提供的注解,它来源于JSR-250规范提案,是Java语言规范或标准的一部分。
  2. 工作原理

    • @Resource注解主要通过名称匹配(byName)来注入依赖。如果名称匹配失败,则通过类型匹配(byType)来查找依赖。
    • 在使用@Resource注解时,可以指定name和type属性。name属性指定要注入的bean的名称,而type属性指定要注入的bean的类型。
  3. 使用场景

    • @Resource注解可以用在字段或setter方法上。
    • 当需要按照名称注入依赖时,@Resource注解是一个很好的选择。
  4. 注意事项

    • 如果使用@Resource注解注入的bean没有被提前加载(例如在Spring容器中),则会报错。
    • 在加载时,是根据类名(不包括包名)判断的,如果出现重复的类名会报异常(即使不在同一个包中也会报异常)。

二、@Autowired注解

  1. 来源

    • @Autowired注解是Spring框架提供的注解,用于自动装配bean。
  2. 工作原理

    • @Autowired注解主要通过类型匹配(byType)来注入依赖。
    • 如果Spring容器中找到一个唯一的bean与要注入的类型匹配,则直接注入该bean。
    • 如果存在多个同类型的bean,则Spring会通过字段名或参数名来进一步匹配(也称为byName匹配),或者可以使用@Primary注解来标记一个bean为主要候选者,或者使用@Qualifier注解来指定注入的bean。
  3. 使用场景

    • @Autowired注解可以用在构造器、方法、字段或参数上。
    • 在Spring框架中,依赖注入可以通过多种方式来实现,包括构造器注入、字段注入和方法注入。其中,构造器注入是推荐的方式,因为它可以确保依赖在对象创建时就被注入。
  4. 注意事项

    • 如果在Spring容器中找不到与某个依赖类型匹配的bean实例(或者找到多个但没有明确的优先级),那么Spring将抛出异常,除非将该注解的required属性设置为false。
    • 使用@Autowired注解进行字段注入时,不利于单元测试,因为依赖是通过反射注入的。因此,Spring官方已经不建议这种使用方式。

三、@Resource与@Autowired的区别

  1. 来源不同

    • @Resource是Java EE规范的一部分,适用于任何兼容的Java EE容器。
    • @Autowired是Spring框架提供的注解。
  2. 依赖查找顺序不同

    • @Resource先根据名称查找,如果找不到再根据类型查找。
    • @Autowired先根据类型查找,如果找到多个再根据名称查找。
  3. 支持的参数不同

    • @Autowired只支持设置一个required参数。
    • @Resource支持设置多个参数,包括name和type等。
  4. 依赖注入的支持不同

    • @Autowired支持属性注入、构造方法注入和Setter注入。
    • @Resource只支持属性注入和Setter注入,不支持构造方法注入。
  5. 编译器提示不同

    • 在某些IDE(如IDEA)中,使用@Autowired注入Mapper对象时可能会提示报错信息(尽管程序可以正常执行),而使用@Resource则不会出现此问题。
相关推荐
Dorcas_FE13 分钟前
axios请求缓存与重复拦截:“相同请求未完成时,不发起新请求”
前端·spring·缓存
南部余额43 分钟前
Spring 基于注解的自动化事务
java·spring·自动化
Mr.Entropy2 小时前
请求超过Spring线程池的最大线程(处理逻辑)
数据库·sql·spring
知其然亦知其所以然3 小时前
三分钟接入!SpringAI 玩转 Perplexity 聊天模型实战
后端·spring·langchain
DKPT14 小时前
JVM中如何调优新生代和老生代?
java·jvm·笔记·学习·spring
喂完待续16 小时前
【序列晋升】29 Spring Cloud Task 微服务架构下的轻量级任务调度框架
java·spring·spring cloud·云原生·架构·big data·序列晋升
Volunteer Technology17 小时前
三高项目-缓存设计
java·spring·缓存·高并发·高可用·高数据量
zzywxc78721 小时前
AI在金融、医疗、教育、制造业等领域的落地案例(含代码、流程图、Prompt示例与图表)
人工智能·spring·机器学习·金融·数据挖掘·prompt·流程图
一个尚在学习的计算机小白1 天前
spring
android·java·spring
Cloud-Future1 天前
Spring MVC 处理请求的流程
java·spring·mvc