当前位置: 首页 > news >正文

@Resource 与 @Autowired:Spring 中的依赖注入注解大比拼

在 Spring 框架中,依赖注入(DI)是核心功能之一,它允许开发者将组件之间的依赖关系交给 Spring 容器管理,从而实现解耦和更灵活的代码结构。@Resource@Autowired 是两种常用的依赖注入注解,它们虽然功能相似,但在使用场景和行为上存在一些关键区别。本文将深入探讨这两种注解的区别,帮助你在实际开发中做出更合适的选择。

@Resource 和 @Autowired 的区别

特性@Resource@Autowired
来源Java EESpring
默认注入方式按名称匹配(by name),找不到则按类型匹配(by type)按类型匹配(by type)
是否需要指定名称可选,通过 name 属性指定可选,通过 @Qualifier 注解指定
灵活性提供了按名称和按类型的双重匹配主要按类型匹配,但可以通过 @Qualifier 细化
兼容性适用于多种 Java EE 容器专用于 Spring 容器
使用场景适用于需要按名称注入的场景适用于大多数 Spring 应用,尤其是需要按类型注入的场景

1. @Resource:Java EE 的标准注解

@Resource 是 Java EE 提供的一个注解,用于注入资源。它不仅适用于 Spring 容器,还广泛用于其他 Java EE 容器(如 WebLogic、WildFly 等)。这使得 @Resource 在混合使用 Java EE 和 Spring 的项目中非常有用。

1.1 功能与行为

  • 默认行为@Resource 默认按 名称匹配(by name)注入。如果找不到匹配的 Bean,则会按 类型匹配(by type)注入。

  • 灵活性:提供了按名称和按类型的双重匹配机制,使得注入更加灵活。

  • 兼容性:作为 Java EE 的标准注解,@Resource 在多种 Java EE 容器中都能正常工作,具有良好的兼容性。

1.2 示例

java复制

@Resource
private ErpSaleReturnMapper erpSaleReturnMapper;

在上面的例子中,@Resource 会尝试注入一个名为 erpSaleReturnMapper 的 Bean。如果找不到,它会按类型匹配,注入一个 ErpSaleReturnMapper 类型的 Bean。

2. @Autowired:Spring 的核心注解

@Autowired 是 Spring 框架提供的注解,专门用于依赖注入。它是 Spring 的核心功能之一,与 Spring 的其他特性(如 @Qualifier@Primary 等)配合使用时非常强大。

2.1 功能与行为

  • 默认行为@Autowired 默认按 类型匹配(by type)注入。如果存在多个相同类型的 Bean,可以通过 @Qualifier 注解指定具体的 Bean 名称。

  • 类型安全:默认按类型匹配,减少了因名称错误导致的注入失败,提高了代码的健壮性。

  • Spring 特性集成:与 Spring 的其他功能(如 @Qualifier@Primary 等)配合使用时更强大。

2.2 示例

java复制

@Autowired
private ErpSaleReturnMapper erpSaleReturnMapper;

在上面的例子中,@Autowired 会按类型匹配,注入一个 ErpSaleReturnMapper 类型的 Bean。如果有多个 ErpSaleReturnMapper 类型的 Bean,可以通过 @Qualifier 指定具体的 Bean 名称:

java复制

@Autowired
@Qualifier("erpSaleReturnMapper")
private ErpSaleReturnMapper erpSaleReturnMapper;

3. @Resource 与 @Autowired 的区别

3.1 来源

  • @Resource:来自 Java EE,是 Java EE 的标准注解。

  • @Autowired:来自 Spring,是 Spring 的核心注解。

3.2 默认注入方式

  • @Resource:默认按名称匹配(by name),找不到则按类型匹配(by type)。

  • @Autowired:默认按类型匹配(by type)。

3.3 是否需要指定名称

  • @Resource:可以通过 name 属性指定注入的 Bean 名称。

  • @Autowired:可以通过 @Qualifier 注解指定注入的 Bean 名称。

3.4 灵活性

  • @Resource:提供了按名称和按类型的双重匹配机制,灵活性更高。

  • @Autowired:主要按类型匹配,但可以通过 @Qualifier 细化,适用于大多数 Spring 应用。

3.5 兼容性

  • @Resource:适用于多种 Java EE 容器,具有良好的兼容性。

  • @Autowired:专用于 Spring 容器,与 Spring 的其他功能集成更紧密。

3.6 使用场景

  • @Resource:适用于混合使用 Java EE 和 Spring 的项目,特别是在需要按名称注入的场景中。

  • @Autowired:适用于纯 Spring 项目,特别是需要使用 Spring 高级特性(如 @Qualifier@Primary 等)的场景。

4. 推荐使用场景

4.1 推荐使用 @Resource 的场景

  • Java EE 组件:如果你需要在 Java EE 组件(如 EJB、JPA 等)中注入依赖,建议使用 @Resource

  • 按名称注入:当你需要明确指定注入的 Bean 名称时,@Resourcename 属性可以方便地实现这一点。

  • 统一性:为了保持项目中注解的一致性,特别是在既有 Java EE 组件又有 Spring 组件的项目中,使用 @Resource 可以减少混淆。

4.2 推荐使用 @Autowired 的场景

  • Spring 组件:如果你主要在 Spring 管理的 Bean 中进行依赖注入,建议使用 @Autowired

  • 需要 Spring 特性:如果你需要使用 Spring 的高级特性(如 @Qualifier@Primary 等),@Autowired 是更好的选择。

  • 类型安全:如果你更倾向于按类型匹配,@Autowired 提供了更严格的类型检查,减少了因名称错误导致的注入失败。

5. 示例代码

假设你的项目中既有 Java EE 组件,也有 Spring 组件,以下是一个混合使用的示例:

java复制

// Java EE 组件
@Stateless
public class MyEjbService {@Resourceprivate ErpSaleReturnMapper erpSaleReturnMapper; // 使用 @Resource 注入
}// Spring 组件
@Service
public class MySpringService {@Autowiredprivate ErpSaleReturnMapper erpSaleReturnMapper; // 使用 @Autowired 注入
}

6. 总结

在混合使用 Java EE 和 Spring 的项目中,@Resource@Autowired 都是有效的依赖注入方式。选择哪种方式取决于你的具体需求和项目架构:

  • Java EE 组件:推荐使用 @Resource,因为它与 Java EE 容器兼容性更好,且提供了按名称和按类型的双重匹配机制。

  • Spring 组件:推荐使用 @Autowired,因为它与 Spring 的其他功能集成更紧密,提供了更强大的类型安全和高级特性支持。

希望本文能帮助你在实际开发中做出更合适的选择!如果你有任何疑问或建议,欢迎在评论区留言。


如果你喜欢这篇文章!请点关注和收藏吧。你的关注和收藏会是我努力更新的动力,祝关注和收藏的帅哥美女们今年都能暴富。如果有更多问题,欢迎随时提问


http://www.mrgr.cn/news/96122.html

相关文章:

  • 前端全局编程和模块化编程
  • Android面试之基础算法总结
  • 01 设计模式和设计原则
  • MyBatis-Plus(SpringBoot版)学习第一讲:简介入门案例
  • vue vue3 走马灯Carousel
  • 高性能 Android 自定义 View:数据渲染与事件分发的双重优化
  • QT三 自定义控件,自定义控件的事件处理自定义事件过滤,原始事件过滤
  • 自动化测试selenium(Java版)
  • Java基础关键_029_线程(二)
  • Vue3 项目通过 docxtemplater 插件动态渲染 .docx 文档(带图片)预览,并导出
  • linux - centos7 部署 redis6.0.5
  • Echarts使用
  • 字节跳动前端开发实习生面试总结
  • 蓝桥杯高频考点——二分(含C++源码)
  • QT自运行程序
  • 海康HTTP监听报警事件数据
  • Docker+Ollama+Xinference+RAGFlow+Dify+Open webui部署及踩坑问题
  • 2.4 Gannt图【甘特图】
  • EMQX Dashboard
  • 运行前端项目报错解决方法