@Autowired和@Resource的用法与区别

1024程序员节

前言:

@Autowired 和 @Resource 来自不同的“父类”,其中 @Autowired 是 Spring 定义的注解,而 @Resource 是 Java 定义的注解,它来自于 JSR-250(Java 250 规范提案)。当它们的实现类只有一个时,那么用法没有任何区别,但是如果有多个时,就需要额外处理了。

复现:

当存在多个实现类时,不做额外处理程序会报错无法运行。

  1. @Autowired在编译时就报错了,无法编译通过
  2. @Resource在运行启动时报错,找不到加载哪一个实现类

目录结构:

  • controller
    • BaseController.java
  • service
    • BaseService.java
    • impl
      • MyServiceImpl.java
      • YourServiceImpl.java

代码:

BaseContoller.java

package com.suhuamo.controller;

import com.suhuamo.service.BaseService;
import com.suhuamo.service.impl.MyServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;

import javax.annotation.Resource;

/**
 * @author suhuamo
 * @date 2023-06-21
 * @slogan 也许散落在浩瀚宇宙的小行星们也知道
 */
@Controller
public class BaseController {

    @Autowired
//    @Qualifier(value = "myServiceImpl")
//    @Resource
    BaseService baseService;

    public void saiHi() {
        baseService.sayHi();
    }
}

BaseService.java

package com.suhuamo.service;

/**
 * @author suhuamo
 * @date 2023-06-21
 * @slogan 也许散落在浩瀚宇宙的小行星们也知道
 */
public interface BaseService {
    /**
     *  说hi
     * @param
     * @return void
     */
    void sayHi();
}

MyServiceImpl.java

package com.suhuamo.service.impl;

import com.suhuamo.service.BaseService;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service;

/**
 * @author suhuamo
 * @date 2023-06-21
 * @slogan 也许散落在浩瀚宇宙的小行星们也知道
 */
@Service
public class MyServiceImpl implements BaseService {
    @Override
    public void sayHi() {
        System.out.println("MyServiceImpl say Hi");
    }
}

YourServiceImpl.java

package com.suhuamo.service.impl;

import com.suhuamo.service.BaseService;
import org.springframework.stereotype.Service;

/**
 * @author suhuamo
 * @date 2023-06-21
 * @slogan 也许散落在浩瀚宇宙的小行星们也知道
 */
@Service
public class YourServiceImpl implements BaseService {
    @Override
    public void sayHi() {
        System.out.println("YourServiceImpl say Hi");
    }
}

@Autowired

在只有一个实现类时,直接使用@Autowired 即可

有多个实现类时,需要做额外处理(如本文示例),有以下三种方法,优先级高到低。

再额外加一个注解@Qualifier(value = “myServiceImpl”),来表明需要注入的实现类, myServiceImpl 是对应实现类的类名首字母小写。即注入的MyServiceImpl类

    @Autowired
    @Qualifier(value = "myServiceImpl")
    BaseService baseService;

在实现类上加上@Primary注解,来表明该实现类在自动注入时的为默认注入类。遇上@Qualifier则不生效(即@Qualifier优先级最高)。即注入的MyServiceImpl类

@Primary
@Service
public class MyServiceImpl implements BaseService {
    @Override
    public void sayHi() {
        System.out.println("MyServiceImpl say Hi");
    }
}

在自动注入定义变量时名称设置为实现类的类名,首字母小写。即注入的MyServiceImpl类

    @Autowired
    BaseService myServiceImpl;

@Resource

在只有一个实现类时,直接使用@Resource即可

有多个实现类时,需要做额外处理(如本文示例),有以下两种方法,优先级高到低。

在@Resource注解中加上name参数或者type参数,指定需要注入的实现类,可以两个都写,也可以只写一个。(都写时要注意是对应的同一个实现类,否则会报错)。即注入的YourServiceImpl类

    @Resource(name = "yourServiceImpl", type = YourServiceImpl.class)
    // @Resource(name = "yourServiceImpl")
    // @Resource(type = YourServiceImpl.class)
    BaseService baseService;

在自动注入定义变量时名称设置为实现类的类名,首字母小写。即注入的YourServiceImpl类

    @Resource
    BaseService yourServiceImpl;

提示:

  1. 在IDEA中,使用@Autowired会爆红,使用@Resource则不会。
  2. 因为@Resource是JAVA自带的,无论你使用什么框架都可以用,所以不用担心会报错,但是@Autowired只能在Spring框架中使用,如果你写的代码不是SPring的框架,那么就不能使用@Autowired,所以IDEA检测到@Autowired会出现爆红,但是@Resource不会。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/899862.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

github pages + hugo 搭建静态博客网站

体验地址 1. 起因, 目的: 其实6年前,我就写过这个。 项目代码 博客地址 最近想改写一下。 github 推荐的主题是 Jekyll, 我当时用的就是这个,感觉很麻烦。尤其是文章命名。 新的主题 hugo 用起来还行。 2.过程: 过程记录&am…

代码随想录算法训练营第六天|454四数相加II、 383赎金信、15三数之和、18四数之和

day06 1. 454四数相加II 首先定义 一个unordered_map,key放a和b两数之和,value 放a和b两数之和出现的次数。遍历大A和大B数组,统计两个数组元素之和,和出现的次数,放到map中。定义int变量count,用来统计 …

新电脑Win11家庭中文版跳过联网激活方法(教程)

预装Win11家庭中文版的新电脑,如何跳过联网激活;由于微软限制必须要联网激活,需要使用已有的微软账户登入或者注册新的微软账户后才可以继续开机使用,Win11联网后系统会自动激活。下面介绍一下初次开机初始化电脑时如何跳过联网激…

虚拟滚动列表如何实现?

highlight: a11y-dark 虚拟滚动列表&#xff0c;虚拟滚动的关键在于只渲染当前视口内可见的数据项&#xff0c;而不是一次性渲染所有数据项。这可以显著提高性能&#xff0c;尤其是在处理大量数据时。 以下是一个完整的虚拟滚动列表的示例代码&#xff1a; <!DOCTYPE htm…

RFC2616 超文本传输协议 HTTP/1.1

一、URL-俗称“网址” HTTP 使用 URL(Uniform Resource Locator&#xff0c;统一资源定位符)来定位资源&#xff0c;它是 URI(Uniform Resource Identifier&#xff0c;统一资源标识符)的子集&#xff0c;URL 在 URI 的基础上增加了定位能力 URI 除了包含 URL&#xff0c;还包…

ADC的交流参数

ADC的交流参数是衡量其在处理交流信号时性能的关键指标。一般包括&#xff1a; 1 信噪比&#xff08;Signal-to-Noise Ratio, SNR&#xff09; 这是衡量ADC输出信号中有用信号与噪声水平的比值。信噪比越高&#xff0c;表示ADC的性能越好。 SNR (dB) MaxRMSSignal / RMSNoise…

【你也能从零基础学会网站开发】 SQL Server结构化查询语言数据操作应用--DML篇 select语句数据查询操作详解 今天干货满满!《1024特别篇》

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;程序猿、设计师、技术分享 &#x1f40b; 希望大家多多支持, 我们一起学习和进步&#xff01; &#x1f3c5; 欢迎评论 ❤️点赞&#x1f4ac;评论 &#x1f4c2;收藏 &#x1f4c2;加关注 select查询语句…

百度ocr服务自动实现文字识别、图片识别功能

百度ocr服务个人注册使用 介绍一个百度免费的ocr服务&#xff0c;通过调用SDK实现文字、图片识别等功能 1. 复制地址到自己的浏览器打开 https://cloud.baidu.com/doc/OCR/index.html2. 选择【登录】 3. 使用【短信登录】 4. 登录后需要选择【个人刷脸实名认证】 百度官方网…

第5.2章|25考研复试综合素质面试最常见问题50问【附上完整答案】超详细考研机械复试面试经验总结全流程 考研复试调剂问题看这一篇就够了!

接着上一章节的内容我们继续完善这50问的题目。上章节的内容参考这个文章。 第5.1章|25考研复试综合素质面试最常见问题50问【附上完整答案】超详细考研复试面试经验总结全流程 考研复试问题看这一篇就够了!考研复试调剂面试问题-CSDN博客https://blog.csdn.net/weixin_56510…

Linux基础命令(六)之 cut,sort,uniq,tr

目录 一&#xff0c;切割显示cut 参数及其作用 常见用法 二&#xff0c;排序显示sort 参数及其作用 常见用法 三&#xff0c;去重显示uniq 常见用法 四&#xff0c;替换文件中的字符显示tr 参数及其作用 常见用法 一&#xff0c;切割显示cut 用于按列提取文本内容 语…

Redis学习笔记(三)--Redis客户端

文章目录 一、命令行客户端二、图形界面客户端1、Redis Desktop Manager2、RedisPlus 三、java代码客户端 本文参考&#xff1a; Redis学习汇总&#xff08;已完结&#xff09; Redis超详细入门教程&#xff08;基础篇&#xff09; Redis视频从入门到高级&#xff0c;redis视频…

Text实现美团部分样式

Text基础 首先是Text的相关基础。 https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-basic-components-text-0000001815927600 Text是显示一段文本的组件。 可以包含Span、ImageSpan、SymbolSpan和ContainerSpan子组件。 接口 Text(content?: string | …

基于SpringBoot设计模式之结构型设计模式·桥接模式

文章目录 介绍开始架构图定义类的功能定义类的实现 测试样例 总结 介绍 将抽象部分与它的实现部分分离&#xff0c;使他们都可以独立地发生变化。 Bridge的意思是桥梁。就像在现实世界中&#xff0c;桥梁的功能是将河流的两侧连接起来一样, Bridge模式的作用也是将两样东西连接…

西南大学的计算机怎么样?

C哥专业提供——计软考研院校选择分析专业课备考指南规划 西南大学计算机学院2024届考研呈现"背道而驰"的走势&#xff0c;学硕(计算机科学与技术)分数线大幅提升23分至333分&#xff0c;而专硕(电子信息)分数线大幅下降30分至300分。学硕实际录取36人&#xff0c;复…

安装vue发生异常:npm ERR! the command again as root/Administrator.

一、异常 npm ERR! The operation was rejected by your operating system. npm ERR! Its possible that the file was already in use (by a text editor or antivirus), npm ERR! or that you lack permissions to access it. npm ERR! npm ERR! If you believe this might b…

AI创作3款软件分享,助力内容创作者高效产出优质作品

为了增加创造力和作品质量&#xff0c;许多创作者开始利用人工智能辅助工具。这些工具不仅可以帮助我们迅速生成各种类型的内容&#xff0c;例如文章、绘画、视频广告等&#xff0c;还提供语法检查和优化建议等实用功能。本文将向大家推荐三款适用于Ai先行者、Tracup、Adoe Fir…

PDF.js的使用及其跨域问题解决

目录 一、PDF.js 简介 二、使用配置和步骤 1.引入PDF.js 2.加载PDF文件 3.渲染PDF页面 三、在Vue中使用PDF.js示例 1.安装PDF.js 2.在Vue组件中使用 四、在原生js中使用PDF.js示例 1.加载PDF文件并渲染页面 五、解决跨域问题 1.服务器配置 2.使用代理服务器 下面介…

【大模型】3分钟了解提示(Prompt)工程、检索增强(RAG)和微调

我们先看下面这个图&#xff1a; 简单理解大模型是通过海量训练数据训练出来的&#xff0c;它的能力非常强&#xff0c;但是有时候会给出错误的回答。那产生错误的原因可能是什么呢&#xff1f; 1.提问错误&#xff08;提示工程&#xff09; 在我们提问的方式不对的情况下&a…

MySql中常用的日期函数

TIMESTAMPDIFF(unit, start_time, end_time)&#xff1a;日期相减 计算两个时间之间的差值&#xff0c;并以指定的单位返回结果。unit参数可以是以下之一&#xff1a;SECOND、MINUTE、HOUR、DAY、WEEK、MONTH、QUARTER或YEAR。这个函数返回的是两个时间之间的差值&#xff0c;可…

Anchor DETR论文笔记

原文链接 [2109.07107] Anchor DETR: Query Design for Transformer-Based Object Detection (arxiv.org)https://arxiv.org/abs/2109.07107 原文笔记 What 提出了一种新的基于锚点的查询设计&#xff0c;即将锚点编码为对象查询。 Why 对象检测任务是预测图像中每个对象…