@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则不会出现此问题。
相关推荐
命中的缘分31 分钟前
SpringCloud原理和机制
后端·spring·spring cloud
Howard_Stark36 分钟前
Spring的BeanFactory和FactoryBean的区别
java·后端·spring
再拼一次吧2 小时前
Spring进阶篇
java·后端·spring
fanTuanye3 小时前
Spring-全面详解(学习总结)
java·spring·ssm框架
m0_564264185 小时前
springboot项目之websocket的坑:spring整合websocket后进行单元测试后报错的解决方案
java·经验分享·spring boot·websocket·spring·单元测试·报错
冼紫菜6 小时前
SpringBoot配置RestTemplate并理解单例模式详解
java·spring boot·后端·spring·单例模式
mask哥7 小时前
实用的java技术架构组件汇总
java·spring·微服务·springboot·vo校验·常用java组件
小可爱的大笨蛋8 小时前
Spring AI Alibaba - MCP连接 MySQL
人工智能·mysql·spring·mcp
王有品14 小时前
Spring MVC 多个拦截器的执行顺序
数据库·spring·mvc
小布不吃竹1 天前
SpringMVC框架
spring·mvc