Spring Boot中使用@Autowire装配接口是怎么回事?

news2024/9/24 19:30:25

在学习使用Spring Boot框架时候,发现了一个特别的现象

UserMapper是一个接口,在另一个类中好像直接使用@Autowired装配了一个UserMapper对象???我纳闷了一会儿,接口居然可以直接实例对象吗?

根据我对的Java基础知识的了解,接口和抽象类都只是描述了一个轮廓、实现,不能直接作为一个对象去实例化使用的,都需要具体的类去继承和实现。

后来查阅资料才知道,接口确实是不能直接实例化的!要想使用接口作为对象,需要用到匿名内部类,及就是在多线程编程中经常使用的那个..

实现接口的匿名内部类

多线程中我们经常会实例一个继承Thread的匿名内部类:

class MyThread extends Thread {
    @Override
    public  void run() {
        System.out.println("继承Thread, 重写run");
     }
}

这里就是使用{}大括号,在大括号中直接重写必要的方法,然后形成一个匿名内部类。

当然这里的Thread并不是一个抽象类也不是一个接口,但是道理是相同的。

我们只要在创建实现接口的匿名内部类时候,在大括号{}中实现接口的所有方法即可。

创建一个测试接口:

public interface ITest {
    public String test();
}

然后在一个类中尝试创建”ITest对象“

其实在尝试new的时候IDEA已经给了你提示(需要通过{}来创建匿名内部类)了,根据提示敲下enter就会得到:

public class Test {
    private  ITest iTest = new ITest() {
        @Override
        public String test() {
            return null;
         }
     };
}

所以小结就是,”接口对象“这个说法是错误的!

本质上也没有接口对象,但是有实现接口的匿名内部类。

而最开始展示的Spring Boot中使用@Autowired注解,构建了一个”接口对象“,实际上只是Spring Boot内部隐藏了实现接口并创建匿名内部类的过程和样子,留下像是自动装配接口对象的样子。

写到这里已经开始感慨自己基本功有点不扎实了..其实要是匿名内部类学的够清晰应该也不至于对这个所谓的”接口对象“产生这么大的疑惑。

@Mapper的功能之一

不过我又发现了一个问题。我理解的@Autowired功能是将Spring IoC容器中构建好的对象在需要的时候注入进去,而这是需要配合五大类注解如@Component、@Configuration这些来使用的。

使用类注解注释的类才能被自动装配,否则会报异常(Spring中找不到对应的Bean,忘记叫什么exception了)。

而最开始的接口我并没有使用类注解进行注释,而是使用@Mapper来进行注释的。

所以我对@Mapper的理解也是相当匮乏..我最初只是觉得它是标识映射器,用来连接与接口对应的xml和数据库的。

查阅资料知道,@Mapper能够给接口自动生成一个实现类(匿名内部类),并且将这个类托管给Spring进行管理。这也就印证了为啥可以在接口头上使用@Autowired了..

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

测试开发之Django实战示例 第十三章 上线

在上一章,为其他程序与我们的Web应用交互创建了RESTful API。本章将学习如何创建生产环境让我们的网站正式上线,主要内容有:配置生产环境创建自定义中间件实现自定义管理命令1创建生产环境现在该将Django项目正式部署到生产环境中了。我们将按…

深度解读依赖注入DI源码

spring-framework-5.3.10 版本依赖注入代码的入口在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean 。如果想搞清楚为什么是这里需要去学习下Bean的生命周期,这里就不介绍了。AutowiredAutowired private OrderServic…

电子科技大学操作系统期末复习笔记(五):文件管理

目录 前言 文件管理:基础 基本概念 文件 文件系统 文件系统的实现模型 文件的组成 文件名 文件分类 文件结构 逻辑结构 物理结构 练习题 文件管理:目录 文件控制块FCB FCB:File Control Block FCB信息 目录 基本概念 目…

CAN通信笔记-位时间、Tq及采样点同步

本文框架1.前言2. 位时间2.1 位时间定义2.2 位时间计算3. Tq3.1 Tq的计算3.1.1 举个例子3.2 位时间与Tq的换算4. 采样点同步4.1 硬同步4.2 重同步4.2.1 延长PBS1的重同步4.2.2 缩短PBS2的重同步1.前言 本篇记录些关于CAN的一些学习笔记,说实话CAN协议发展的已经非常…

【项目设计】—— 负载均衡式在线OJ平台

目录 一、项目的相关背景 二、所用技术栈和开发环境 三、项目的宏观结构 四、compile_server模块设计 1. 编译服务(compiler模块) 2. 运行服务(runner模块) 3. 编译并运行服务(compile_run模块) 4…

MicroBlaze系列教程(6):AXI_IIC的使用(24C04 EEPROM)

文章目录 @[toc]AXI_IIC简介MicroBlaze硬件配置常用函数使用示例波形实测参考资料工程下载本文是Xilinx MicroBlaze系列教程的第6篇文章。 AXI_IIC简介 一般情况下,使用FPGA实现I2C协议主要有两种方式:一种是基于Verilog实现起始位、停止位、ACK产生和判断、数据的发送和接收…

1.HTTP及Template介绍

目录 来源 介绍 模板与渲染 Go语言的模板引擎 模板引擎的使用 定义模板文件 解析模板文件 模板渲染 基本示例 模板语法 {{.}} 注释 pipeline 变量 移除空格 条件判断 range with 预定义函数 比较函数 自定义函数 模板的嵌套template block 修改默认的标…

加油站会员管理小程序实战开发教程13

我们上一篇讲解了会员注册的功能,本篇我们介绍一下会员开卡的功能。 会员注册之后,可以进行开卡的动作。一个会员可以有多张会员卡,在微搭中用来描述这种一对多的关系的,我们用关联关系来表达。 登录微搭的控制台,点击数据模型,点击新建数据模型 输入数据源的名称会员卡…

基于 Debain11 构建 asp.net core 6.x 的基础运行时镜像

基于 Debain11 构建 asp.net core 6.x 的基础运行时镜像Linux 环境说明Debian 简介Debian 发行版本关于 Debian 11Linux 常用基础工具Dockerfile 中 RUN 指令RUN 语法格式RUN 语义说明编写 Dockerfile 构建 Runtime 基础镜像ASP.NET Core Runtime 基础镜像Dockerfile 编写Windo…

sklearn主成分分析PCA

文章目录基本原理PCA类图像降维与恢复基本原理 PCA,即主成分分析(Principal components analysis),顾名思义就是把矩阵分解成简单的组分进行研究,而拆解矩阵的主要工具是线性变换,具体形式则是奇异值分解。 设有mmm个nnn维样本X…

【面试题】数组reduce的用法

1. 对数组求和 传统的数组求和方式需要使用forEach循环遍历数组中的每一个元素,然后累加。然而这种方式需要新增一个用于存储累加结果的变量。 function sum(arr) {let res 0arr.forEach(element > res res element);return res }还可以通过数组的reduce方法…

算法笔记(九)—— 暴力递归

暴力递归(尝试) 1. 将问题转化为规模缩小了的同类问题子问题 2. 有明确的不需要的继续递归的条件 3. 有当得到子问题结果之后的决策过程 4. 不记录每一个子问题的解 Question:经典汉诺塔问题 1. 理解清楚,基础三个圆盘的移动…

2.5|iot|嵌入式Linux系统开发与应用|第4章:Linux外壳shell脚本程序编程

1.shell基础 Shell是Linux操作系统内核的外壳,它为用户提供使用操作系统的命令接口。 用户在提示符下输入的每个命令都由shell先解释然后发给Linux内核,所以Linux中的命令通称为shell命令。 通常我们使用shell来使用Linux操作系统。Linux系统的shell是…

高斯课堂 计算机网络(上)

第一章、概述 0、第一章导图 1、计算机网络概述 (1)计算机网络发展历史1:ARPANET->互联网 小写internet是一个宽泛的概念,指的就是互联网 大写Internet是一个专有名词,指的就是我们现在所使用的这样一个全球最大的…

Python(1)变量的命名规则

目录 1.变量的命名原则 3.内置函数尽量不要做变量 4.删除变量和垃圾回收机制 5.结语 参考资料 1.变量的命名原则 ①由英文字母、_(下划线)、或中文开头 ②变量名称只能由英文字母、数字、下画线或中文字所组成。 ③英文字母大小写不相同 实例: 爱_aiA1 print(…

2023VNCTF的两道(暂时)

from http://v2ish1yan.top/2023/02/19/%E6%AF%94%E8%B5%9Bwp/2023vnctf/ 比赛的时候在回学校的路上,所以没有打,听说质量挺高,赛后做一下 象棋王子 一个普通的js游戏,玩过关了就给flag,所以flag肯定在前端源码里 这…

设计模式之观察者模式与访问者模式详解和应用

目录1.访问者模式详解1.1 访问者模式的定义1.1.1 访问者模式在生活中的体现1.1.2 访问者模式的适用场景1.2 访问者模式的通用实现1.3 访问者模式的使用案例之KPI考核1.3.1 类图设计1.3.2 代码实现1.4 访问者模式扩展---分派1.4.1 java中静态分派示例代码1.4.2 java中动态分派1.…

C语言 基于Ncurse库的贪吃蛇游戏项目

为了敲键盘及时响应&#xff0c;需要用到ncurse 测试代码&#xff1a; ncurse1.c /* ncurse1.c */ #include <curses.h> //ncurse的头文件。int main() {char c;int i 0;//ncurse界面的初始化函数。initscr(); for(i0;i<2;i){c getch();printw("\n");//…

一起学 pixijs(2):修改图形属性

大家好&#xff0c;我是前端西瓜哥。 我们做动画、游戏、编辑器&#xff0c;需要根据用户的交互等操作&#xff0c;去实时地改变图形的属性&#xff0c;比如位置&#xff0c;颜色等信息。今天西瓜哥带大家来看看在 pixijs 怎么修改图形的属性。 因为 pixijs 的底层维护了图形…