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

【Spring实战】28 @Autowired 和 @Resource注解的区别与使用

文章目录

    • 1. 区别
      • 1)匹配方式
      • 2)属性名称
      • 3)处理方式
      • 4)支持类型
    • 2. 如何选择
    • 3. 代码示例

Spring 框架是一个强大的 Java 企业应用开发框架,提供了多种依赖注入的方式。其中,@Autowired@Resource 是两个常用的注解,用于实现依赖注入。本文将介绍这两个注解的区别以及在实际应用中如何进行选择。

1. 区别

1)匹配方式

  • @Autowired 是由 Spring 框架提供的注解,用于实现自动装配。它是根据类型进行匹配的,可以用在构造方法、Setter 方法、字段上,甚至可以用在方法参数上。

    @Autowired
    private DemoService DemoService;
    
  • @Resource 是 Java EE 提供的注解,Spring 框架也对其提供支持。它是根据名称进行匹配的,可以用在字段、Setter 方法上,也可以用在方法参数上。

    @Resource(name = "demoService")
    private DemoService DemoService;
    

2)属性名称

  • @Autowired 没提供明确的属性名称指定,它是根据类型进行匹配的,没有类似于 name 属性的指定方式

3)处理方式

  • @Autowired 按照类型匹配进行注入,如果有多个类型匹配,Spring 会选择最匹配的 bean 进行注入。如果没有匹配的bean,会抛出异常

  • @Resource 按照名称匹配进行注入,首先按照指定的名称查找 bean,如果没有找到,则按照类型查找

4)支持类型

  • @Autowired 是 Spring 提供的注解,更加特定于 Spring 框架

  • @Resource 是 Java EE 提供的注解,因此在不使用 Spring 框架时也可以使用

    但是,在 Spring 中更推荐使用 @Autowired

2. 如何选择

在选择使用 @Autowired 还是 @Resource 时,可以根据具体情况考虑以下几点:

  • 项目框架选择:

    如果是纯 Spring 项目,建议使用 @Autowired,因为它更加灵活,是 Spring 框架本身提供的特性。如果需要与非 Spring 框架的组件进行整合,或者在非 Spring 项目中使用,可以考虑使用 @Resource

  • 依赖注入方式:

    如果注重类型匹配,而不关心名称,使用 @Autowired。如果需要根据名称进行匹配,使用 @Resource

  • 项目约定:

    在团队中建议使用一致的注解,以便统一代码风格。可以根据项目的实际情况,选择一种注解作为主要的依赖注入方式

3. 代码示例

使用@Autowired注解的示例:

DemoService.java

package com.cheney.demo.service;import org.springframework.stereotype.Service;@Service
public class DemoService {public void syaHello(){System.out.println("Hello");}
}

DemoController.java

package com.cheney.demo.controller;import com.cheney.demo.service.DemoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RestController;@RestController
public class DemoController {@Autowiredprivate DemoService demoService;public void hello() {demoService.syaHello();}
}

使用@Resource注解的示例:

DemoService.java

package com.cheney.demo.service;import org.springframework.stereotype.Service;@Service
public class DemoService {public void syaHello(){System.out.println("Hello");}
}

DemoController.java

package com.cheney.demo.controller;import com.cheney.demo.service.DemoService;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.RestController;@RestController
public class DemoController {@Resource(name = "demoService")private DemoService demoService;public void hello() {demoService.syaHello();}
}

在以上示例中,DemoService 是一个服务类,DemoController 是一个控制器类。通过 @Autowired@Resource 注解,实现了 DemoService 的依赖注入。选择使用哪种注解取决于项目的具体需求和约定。

相关文章:

  • Linux完全卸载Anaconda3和MiniConda3
  • 索引的概述和使用
  • 线性代数——(期末突击)概率统计习题(概率的性质、全概率公式)
  • YOLOv5改进 | 注意力篇 | CGAttention实现级联群体注意力机制 (全网首发改进)
  • 智能路由器 端口映射 (UPnP) Padavan内网端口映射配置方法
  • 山西电力市场日前价格预测【2024-01-13】
  • openssl3.2 - 官方demo学习 - cms - cms_sign.c
  • Python数据的验证
  • 嵌入式培训机构四个月实训课程笔记(完整版)-Linux网络编程第一天-socket编程练习(物联技术666)
  • DCP文件传输的重要性与应用
  • GNU Tools使用笔记
  • 初识 Elasticsearch 应用知识,一文读懂 Elasticsearch 知识文集(1)
  • [足式机器人]Part2 Dr. CAN学习笔记-Advanced控制理论 Ch04-8 状态观测器设计 Linear Observer Design
  • K8S的存储卷---数据卷
  • 物流实时数仓DWD层——1.准备工作
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • [数据结构]链表的实现在PHP中
  • Apache Zeppelin在Apache Trafodion上的可视化
  • codis proxy处理流程
  • JavaScript实现分页效果
  • js
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • Python_网络编程
  • TCP拥塞控制
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • 批量截取pdf文件
  • 实习面试笔记
  • 跳前端坑前,先看看这个!!
  • 线上 python http server profile 实践
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 应用生命周期终极 DevOps 工具包
  • 湖北分布式智能数据采集方法有哪些?
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • #QT(串口助手-界面)
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (1)常见O(n^2)排序算法解析
  • (C语言)球球大作战
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (精确度,召回率,真阳性,假阳性)ACC、敏感性、特异性等 ROC指标
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (三十)Flask之wtforms库【剖析源码上篇】
  • (数据大屏)(Hadoop)基于SSM框架的学院校友管理系统的设计与实现+文档
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (转)winform之ListView
  • .NET Framework 4.6.2改进了WPF和安全性
  • .Net接口调试与案例
  • /etc/fstab和/etc/mtab的区别
  • /proc/vmstat 详解
  • ?
  • @RequestBody与@ModelAttribute
  • [ C++ ] STL priority_queue(优先级队列)使用及其底层模拟实现,容器适配器,deque(双端队列)原理了解
  • [ 渗透工具篇 ] 一篇文章让你掌握神奇的shuize -- 信息收集自动化工具
  • []error LNK2001: unresolved external symbol _m