【Spring】@Autowired与@Resource的区别

devtools/2024/11/14 1:12:19/

@Autowired 和 @Resource 是 Spring 框架中用于依赖注入的两种注解。虽然它们的主要目的相同,即实现自动装配,但它们有一些关键的区别。

@Autowired

  • 来源:Spring 框架本身。
  • 默认按类型装配:如果没有指定 required 属性,并且没有找到匹配的 bean,会抛出异常。
  • 可以指定 required 属性:如果设置为 false,则在没有找到匹配的 bean 时不会抛出异常,而是将依赖设为 null
  • 支持构造函数、字段、setter 方法注入

@Resource

  • 来源:J2EE(Java EE)标准,定义在 javax.annotation 包中。
  • 默认按名称装配:如果找不到匹配的 bean 名称,会按类型装配。
  • 不支持 required 属性:如果没有找到匹配的 bean,会抛出异常。
  • 主要支持字段和 setter 方法注入,虽然也可以用于构造函数,但不如 @Autowired 直观。

@Autowired代码案例:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;@Component
public class MyService {// 按类型注入@Autowiredprivate MyDependency myDependency;// 按类型注入,required 属性为 false@Autowired(required = false)private OptionalDependency optionalDependency;// 构造函数注入@Autowiredpublic MyService(MyDependency myDependency) {this.myDependency = myDependency;}// Setter 方法注入@Autowiredpublic void setOptionalDependency(OptionalDependency optionalDependency) {this.optionalDependency = optionalDependency;}
}

 @Resource代码案例:

import javax.annotation.Resource;
import org.springframework.stereotype.Component;@Component
public class MyService {// 按名称注入,假设存在名为 "myDependency" 的 bean@Resource(name = "myDependency")private MyDependency myDependency;// 按类型注入(如果找不到名为 "optionalDependency" 的 bean)@Resourceprivate OptionalDependency optionalDependency;// 虽然可以用于构造函数,但不如 @Autowired 直观// 推荐还是使用 @Autowired 进行构造函数注入public MyService() {// 构造函数中可以使用 @Resource,但不如 @Autowired 简洁}// Setter 方法注入@Resourcepublic void setOptionalDependency(OptionalDependency optionalDependency) {this.optionalDependency = optionalDependency;}
}

总结:

  • @Autowired 是 Spring 提供的注解,默认按类型装配,可以指定 required 属性。
  • @Resource 是 J2EE 标准注解,默认按名称装配,如果找不到名称匹配的 bean,会按类型装配。
  • @Autowired 支持构造函数、字段、setter 方法注入,而 @Resource 主要支持字段和 setter 方法注入,虽然也可以用于构造函数,但不如 @Autowired 直观。

http://www.ppmy.cn/devtools/133790.html

相关文章

kaggle 如何利用API下载数据集

首先 上传kaggle官网生成得 API 密钥: kaggle.json 文件。放到该代码同目录下,再运行一下代码。 注: 只需要修改下载竞赛数据集,就可以选择你的指定数据集。 jupyter文件运行 #首先 上传 kaggle.json 文件并设置 API 密钥 #再…

Py2Neo 库将 Json 文件导入 Neo4J

在Python中,利用Py2Neo库可以将JSON数据导入Neo4j图数据库,从而构建知识图谱。Py2Neo是一个Python库,用于与Neo4j图数据库交互。以下是如何使用Py2Neo从JSON文件导入数据的详细步骤: 1. 安装所需库 确保已经安装py2neo库。如果没…

golang 泛型 middleware 设计模式: 一次只做一件事

golang 泛型 middleware 设计模式: 一次只做一件事 1. 前言 本文主要介绍 在使用 gRPC 和 Gin 框架中常用的 middleware 设计模式 还有几种叫法 装饰器模式Pipeline 模式 设计思想: 10 个 10 行函数, 而不是 1 个 100 行函数一次只做一件事, 而不一次做多件事单一职责 2…

基于Java+SpringBoot在线考试系统

一、作品包含 源码数据库设计文档全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 数据库&…

Spring Task详细讲解

✨Spring Task简介 Spring Task 是 Spring 提供的轻量级定时任务工具,也就意味着不需要再添加第三方依赖了,相比其他第三方类库更加方便易用。可以按照约定的时间自动执行某个代码逻辑。 使用场景: 信用卡每月还款提醒银行贷款每月还款提醒…

vue3使用element-plus,树组件el-tree增加引导线

vue3使用element-plus,树组件el-tree增加引导线 vue3项目element-plus,树组件el-tree增加引导线 element-plus组件库的el-tree样式 因为element的样式不满足当前的的需求,UI图,所以对el-tree进行增加了引导线 修改样式如下&am…

Vagrant 没了 VirtualBox 的话可以配 Qemu

开源虚拟机软件 VirtualBox 从当初不可一世的 Sun 易手到 Oracle 之间,变得不那么被许多公司信任了。之前一直是用 Vagrant 搭配 VirtualBox 在 Mac 下使用 Linux 虚拟机,因为不需要用到 Linux 桌面,用 Vagrant 操作虚拟机非常方便。但现在不…

GitHub Org

运营一个GitHub Org(组织)是一个复杂但充满价值的过程,它涉及多个方面,包括项目管理、团队协作、代码审查、文档维护、社区建设等。以下是一篇关于如何运营GitHub Org的详细指南,旨在帮助组织者更好地管理和维护其GitH…