@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则不会出现此问题。
相关推荐
m0_7482345232 分钟前
【Spring Boot】Spring AOP动态代理,以及静态代理
spring boot·后端·spring
工业甲酰苯胺4 小时前
深入解析 Spring AI 系列:解析返回参数处理
javascript·windows·spring
小高不明5 小时前
仿 RabbitMQ 的消息队列2(实战项目)
java·数据库·spring boot·spring·rabbitmq·mvc
荆州克莱6 小时前
Golang的图形编程基础
spring boot·spring·spring cloud·css3·技术
m0_748235076 小时前
springboot中配置logback-spring.xml
spring boot·spring·logback
蒙双眼看世界7 小时前
IDEA运行Java项目总会报程序包xxx不存在
java·spring·maven
计算机学姐15 小时前
基于微信小程序的驾校预约小程序
java·vue.js·spring boot·后端·spring·微信小程序·小程序
qw94919 小时前
Spring 6 第6章——单元测试:Junit
spring·junit·单元测试
荆州克莱20 小时前
Golang的网络编程安全
spring boot·spring·spring cloud·css3·技术
清风-云烟20 小时前
使用redis-cli命令实现redis crud操作
java·linux·数据库·redis·spring·缓存·1024程序员节