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

IOC控制反转---相关的介绍和6大注解解读(类注解+方法注解)

文章目录

  • 1.传统方式造车
  • 2.传统方法的弊端
  • 3.IOC的引入
  • 3.IOC对于图书管理系统进行改进(初识)
  • 4.注解的使用说明
    • 4.1@controller注解
    • 4.2@service注解
    • 4.3@component注解
    • 4.4关于spring命名的问题
    • 4.5@component重命名
    • 4.6@repository注解
    • 4.7@configuration注解
    • 4.8注解之间的关联
    • 4.9@Bean注解
  • 5.扫描路径

1.传统方式造车

1)依次构建这个相关的类:我们的这个汽车类,车身类,底盘类,以及我们的这个轮胎类;

2)我们的这个car类里面就是进行这个构造函数编写,以及我们的这个run方法的日志输出;

3)因为我们的这个car依赖于这个framework,因此这个里面就是需要new这个framwork对象,因此我们需要创建车身这个类,然后以此类推,我们的这个车身依赖于这个底盘,我们需要去构建这个底盘这个类,然后我们的这个底盘依赖于这个轮胎,这个时候我们去构建这个轮胎这个类;

4)在我们的这个轮胎这个类里面,我们规定这个轮胎的尺寸大小,在这个main里面调用这个car的构造方法,我们的这个小车就可以跑起来了;

image-20241115084534272

2.传统方法的弊端

我们上面的这个car里面的这个tire的尺寸大小就是写死的,这样写并不好,如果我们想要把这个参数进行传递,就需要进行下面的这个修改;

这个时候因为这个参数传递的原因,我们的这个里面的每一个文件都需要进行修改,正所谓牵一发而动全身,这个就说明我们的这个项目里面的这个不同文件之间的这个耦合度太高了,以至于我们的一个细节需要每一个文件都进行修改,基于这个原因,我们引入下面的这个IOC的写法;

image-20241117150615922

3.IOC的引入

上面说了,这个传统写法想要进行这个参数的传递的时候,需要去对于每一个文件都进行相应的修改,因此这个就显得耦合度很高,下面的这个写法就是我们的这个IOC的思想;

这个时候,我们造车的时候需要车身,我们直接让这个car的构造函数里面的这个参数就是我们的这个车身,以此类推,我们的这个车身需要底盘,我们就让这个车身的这个构造方法的参数就是我们的底盘;

image-20241117153000250

image-20241117153113062

我们的这个底盘需要轮胎,我们就让这个底盘里面的这个构造方法的参数就是轮胎:

image-20241117153144856

因为这个轮胎没有什么需要依赖的,因此这个时候我们的这个Tire里面的这个代码基本上保持不变:

image-20241117153223583

我们接下来在这个主方法的里面进行这个调用的过程:

image-20241117153253103

这个时候,如果我们想要给这个轮胎添加上这个颜色,只需要在两个文件里面进行修改:就是在这个time自己的这个类里面去添加上这个对应的成员变量,我们的这个主方法进行这个调用的时候加上这个对应的参数就可以了其他的都是不需要进行修改的;

image-20241117153457521

下面的这个就是我们的这个IOV的一个逻辑:

image-20241117153605306

3.IOC对于图书管理系统进行改进(初识)

1)存对象:@component

2)取对象:@autowired

有了这个依赖注入的这个语法,我们就可以直接去吧我们的这个对象存到我们的这个spring容器里面去,而不需要使用这个new的方式去进行这个对象的创建;

我们的这个bookservice里面的这个代码,可以看到是使用这个new的方式创建了一个这个bookdao对象,这个时候我们可以在这个bookservice上面加上这个component,这个就意味着我们的这个bookservice就会让我们的这个spring容器进行管理;

我们的这个原来的这个new对象的这个方式就可以修改为这个autowored的方式,这个表示的就是我们从这个容器里面吧这个对象拿出来(前提是我们的这个bookdao也是在这个容器里面的);

image-20241120124048736

我们在这个bookdao上面也是添加上这个component,表示我们的这个bookdao也是使用这个spring容器进行管理的;

image-20241120124118392

下面的这个就是我们原来使用的是这个new bookservice的方式,这个时候我们的这个bookservice已经加上了这个spring容器里面了,因此我们就可以使用这个autowired这个方式对于我们的这个对象,从容器里面拿出来;

image-20241120124216129

这个时候,我们直接运行登录查看这个效果,没有出现问题说明我们的这个对象的存和取都是正确的;

4.注解的使用说明

4.1@controller注解

首先我们需要了解一下这个启动类和上下文的概念:

1)启动类:就是下面的这个上面带有我们的这个@springbootapplication的这个类,我们的这个项目的运行就是从这个启动类开始的;

2)上下文:我们的这个程序的运行相关的这个信息就是存储在我们的这个上下文里面的,例如我们的这个线程之间的这个并发执行,我们的这个线程1执行之后轮到这个线程2,线程2执行之后又回到这个线程1,这个时候我们如何知道这个线程1上次离开的时候这个线程执行到什么位置,这个时候我们就可以把这个程序的运行的相关的信息存储到我们的这个上下文里面;

bean就是我们的这个spring进行管理的对象;我们使用这个getbean取出来这个对象,这个是使用的我们的这个对象的类型的方式;

image-20241120132459624

4.2@service注解

image-20241120134224064

当我们使用这个注解的时候:需要在这个启动类里面使用我们的这个getbean方法获取这个容器里面的对象,这个参数是使用的这个类的名字获取这个对象,调用这个对象的方法;(我们上面的那个注释是使用的我们的这个类的类型获取的这个对象);

因为我们的这个使用名字获取这个对象的方式获取的这个对象的这个默认类型就是我们的这个object类型的,因此这个时候我们需要使用我们的这个自定义类型进行强制类型转化;

image-20241120134252300

4.3@component注解

下面的这个就是我们对于这个component这个注解的使用进行演示:

image-20241120135732161

在我们的这个启动类里面:我们使用的是对象名+对象的类型的方式获取这个对象;

image-20241120135757804

4.4关于spring命名的问题

上面的这个情况,前面的两个注解进行使用的时候,我们的这个名字其实是让我们的这个spring直接进行管理的,我们自己是在默认知道了这个规则,才可以在这个getBean里面进行使用的,下面的这两个箭头指向的内容就是我们的这个名字(根据这个spring命名规范起的名字);

image-20241120164949963

下面我们介绍一下这个spring对于我们的这个创建的这个类里面的这个对象的命名规则

1)小驼峰,遵循我们的这个java里面的命名规范;

2)当这个类的名字的前面的两个字母都是大写的时候,我们的这个spring命名就是大写的,如果是第一个字母大写,我们的这个spring就会按照自己的这个小驼峰进行处理;

具体的这个演示如下:

根据这个打印结果,我们可以看到,这个spring进行处理的时候,这个具体的名字是怎么样的,这个就是命名规则,我们的前面的两个字母都是大写的时候,这个spring进行处理的时候才会和我们自己写的这个一样,否则其他的这个情况下都是按照这个小驼峰的规则进行的;

image-20241120165410386

我们可以具体查看这个decapitalize查看这个具体的命名逻辑:和我们上面说的是一样的

image-20241120165622639

4.5@component重命名

这个时候,就是我们不是用这个spring默认给的这个名字,而是在这个component这个后面加上参数,改变这个默认的名字,然后我们再这个启动类里面可以使用我们自己写的这个名字;

image-20241120165056743

4.6@repository注解

其实上面的介绍已经覆盖了大部分情况,因此下面的这个我们选取任何一个方式获取这个spring里面的对象

image-20241120170320214

首先还是定义这个类,里面写上我们的这个方法,类的上面加上这个注解:

我们在这个启动类里面可以使用任意的一个方法获取这个spring里面的对象,下面的这个选择的是第二个方式,就是直接使用名字,这个时候我们需要进行强制类型转换;

image-20241120170523811

使用第三种方式也是可以的,这个时候第一个参数就是我们的对象名字,第二个参数就是我们的这个对象的类型,这个时候不需要进行这个强制类型转换;

image-20241120170653319

4.7@configuration注解

image-20241120171533879

我们在这个启动类使用的是第一个方法取出来我们的这个对象,使用这个对象调用我们的这个里面的成员方法,打印结果也是正常输出的;

image-20241120171602546

4.8注解之间的关联

下面的这个展示的就是我们的这个不同的注解之间的关联:我们的这个controller调用我们的这个service里面的这个内容,我们的这个service继续对于这个repository里面的这个内容进行调用;

image-20241120181857882

4.9@Bean注解

上面介绍的五个注解都是我们的类注解,下面介绍的这个@Bean是我们的这个方法注解:

1)类注解:修饰我们的这个自定义类的;

2)方法注解:对于我们的类里面的这个方法进行修饰的;

下面的这个就是我们的这个@Bean注解修饰我们的这个方法,因为我们的这个方法的返回值是一个对象,我们想让这个spring对于我们的这个返回的对象进行管理;

image-20241120185952514

我们在这个启动类里面还是使用这个相关的方法对于这个对象进行获取,调用我们的这个里面的方法,获取这个对象的相关的属性值;

image-20241120190200994

通过这个例子可以发现,我们的这个@Bean方法注解需要结合上面的这些类注解进行使用,我们可以自己进行测试,我们的这个@configuration注解去掉之后,运行的时候我们是无法获取这个内容的;

因此,我们的这个@Bean需要结合我们的这个类注解进行使用

5.扫描路径

我们的注解,无论是类注解还是方法注解都需要在这个扫描路径下面才可以生效;

扫描路径默认就是:我们的这个启动类所在的这个 路径下面,如果我们挪动这个启动类的位置,这个时候我们的这个代码是会报错的;

默认情况下,我们的这个启动类和我们的这个项目里面的各种包的路径是一样的,因此我们就可以直接运行;

@Bean注解默认的这个方法的名字就是我们的这个定义的方法的名字:可以按照下面的这个方法进行修改

image-20241120194402697
们的这个启动类所在的这个 路径下面,如果我们挪动这个启动类的位置,这个时候我们的这个代码是会报错的;

默认情况下,我们的这个启动类和我们的这个项目里面的各种包的路径是一样的,因此我们就可以直接运行;

@Bean注解默认的这个方法的名字就是我们的这个定义的方法的名字:可以按照下面的这个方法进行修改

在这里插入图片描述

相关文章:

IOC控制反转---相关的介绍和6大注解解读(类注解+方法注解)

文章目录 1.传统方式造车2.传统方法的弊端3.IOC的引入3.IOC对于图书管理系统进行改进(初识)4.注解的使用说明4.1controller注解4.2service注解4.3component注解4.4关于spring命名的问题4.5component重命名4.6repository注解4.7configuration注解4.8注解之…...

SpringBoot(8)-任务

目录 一、异步任务 二、定时任务 三、邮件任务 一、异步任务 使用场景:后端发送邮件需要时间,前端若响应不动会导致体验感不佳,一般会采用多线程的方式去处理这些任务,但每次都需要自己去手动编写多线程来实现 1、编写servic…...

【机器学习】如何配置anaconda环境(无脑版)

马上就要上机器学习的实验,这里想写一下我配置机器学习的anaconda环境的二三事 一、首先,下载安装包: Download Now | Anaconda 二、打开安装包,一直点NEXT进行安装 这里要记住你要下载安装的路径在哪,后续配置环境…...

java 可以跨平台的原因是什么?

我们对比一个东西就可以了,那就是chrome浏览器。 MacOS/Linux/Windows上的Chrome浏览器,那么对于HTML/CSS/JS的渲染效果都一样的。 我们就可以认为ChromeHTML/CSS/JS是跨平台的。 这里面,HTML/CSS/JS是不变的的,对于一个网页&a…...

Solana应用开发常见技术栈

编程语言 Rust Rust是Solana开发中非常重要的编程语言。它具有高性能、内存安全的特点。在Solana智能合约开发中,Rust可以用于编写高效的合约代码。例如,Rust的所有权系统可以帮助开发者避免常见的内存错误,如悬空指针和数据竞争。通过合理利…...

npm | Yarn | pnpm Node.js包管理器比较与安装

一、包管理器比较 参考原文链接: 2024 Node.js Package Manager 指南:npm、Yarn、pnpm 比较 — 2024 Node.js Package Manager Guide: npm, Yarn, pnpm Compared (nodesource.com) 以下是对 Node.js 的三个包管理工具 npm、Yarn 和 pnpm 的优缺点总结&am…...

Linux下编译MFEM

本文记录在Linux下编译MFEM的过程。 零、环境 操作系统Ubuntu 22.04.4 LTSVS Code1.92.1Git2.34.1GCC11.4.0CMake3.22.1Boost1.74.0oneAPI2024.2.1 一、安装依赖 二、编译代码 附录I: CMakeUserPresets.json {"version": 4,"configurePresets": [{&quo…...

【团购核销】抖音生活服务商家应用快速接入②——商家授权

文章目录 一、前言二、授权流程三、授权Url3.1 Url参数表3.2 授权能力表3.3 源码示例 四、授权回调4.1 添加授权回调接口4.2 授权回调接口源码示例 五、实际操作演示六、参考 一、前言 目的:将抖音团购核销的功能集成到我们自己开发的App和小程序中 【团购核销】抖音…...

django宠物服务管理系统

摘 要 宠物服务管理系统是一种专门为宠物主人和宠物服务提供商设计的软件。它可以帮助用户快速找到附近的宠物医院、宠物美容店、宠物寄养中心等服务提供商,并预订相关服务。该系统还提供了一系列实用的功能。通过使用宠物服务管理系统,用户可以更加方便…...

vue2中使用three.js步骤

1.使用npm 下载依赖这里以0.158.0版本为例 npm install three0.158.0 --save 2. <template><div id"container"></div> </template><script> import * as THREE from three; import { OBJLoader } from three/examples/jsm/loaders/O…...

部落商城App开发笔记 2024.11.21 实现进入app就是短视频

初步效果: 基于图鸟UI二次开发, 这里静态资源没有加载, 我在本机上安装了一个nginx, 需要启动一下. PS C:\dev\nginx-1.26.2> start .\nginx.exe重新刷新就有数据了. 先看看目前的页面吧. 首页. 分类: 发现. 消息. 购物车. 我的. 这个项目是有短视频的功能…...

解决.DS_Store 在项目一致无法排除,.gitignore里也不生效

.DS_Store 是 macOS 操作系统创建的隐藏文件&#xff0c;通常用于存储目录的属性&#xff0c;比如视图设置、图标位置等。它通常不应包含在代码仓库中&#xff0c;因此需要排除它。你提到即使将其添加到 .gitignore 文件中&#xff0c;仍然无法排除它&#xff0c;可能是由于以下…...

MySQL-关键字执行顺序

&#x1f496;简介 在MySQL中&#xff0c;SQL查询语句的执行遵循一定的逻辑顺序&#xff0c;即使这些关键字在SQL语句中的物理排列可能有所不同。 &#x1f31f;语句顺序 (8) SELECT (9) DISTINCT<select_list> (1) FROM <left_table> (3) <join_type> JO…...

极客时间《Redis核心技术与实战》开篇词 知识点总结

Redis 主要的数据持久化方式 RDB&#xff08;Redis Database Backup file&#xff09; RDB 是 Redis 提供的一种数据快照持久化方式&#xff0c;它会在指定的时间间隔内生成数据集的时间点快照&#xff0c;并将这些快照保存到磁盘上的一个 RDB 文件中。RDB 文件是一个压缩的二…...

TCP并发服务器

端口号快速复用函数 通过getsockopt和setsockopt函数&#xff0c;管理套接字的端口号复用设置。具体操作如下&#xff1a; getsockopt函数 int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);功能&#xff1a;获取套接字的某些选项的属性。…...

Debug-031-近期功能实现小结

由于时间原因&#xff0c;没办法对每个小的功能点进行比较细致的总结&#xff0c;这里统一去记录一下最近的实现了的功能&#xff0c;算是存档备份&#xff0c;为今后开发带来便利和参考。 一、ACEeditor ACEeditor使用手册&#xff08;一&#xff09;_ace editor-CSDN博客 AC…...

Consumer Group

不&#xff0c;kafka-consumer-groups.sh 脚本本身并不用于创建 Consumer Group。它主要用于管理和查看 Consumer Group 的状态和详情&#xff0c;比如列出所有的 Consumer Group、查看特定 Consumer Group 的详情、删除 Consumer Group 等。 Consumer Group 是由 Kafka 消费者…...

.NET架构师学习大纲

目录 微服务 Consul Ocelot Polly Skywalking Exceptionless Apollo Jenkins Docker Kubernetes DDD领域驱动设计 DevOps CDN Nginx 应用服务器集群 数据库高可用 异步化架构 Azure前沿技术 工具排查 O/RM-EFCore IOC&AOP Core WebApi WebServer 数…...

【代码随想录】贪心

455. 分发饼干 题目 随想录 本质&#xff1a; 对于每个孩子&#xff0c;使用可以满足该孩子的最小的饼干。所以对孩子胃口和饼干进行sort排序&#xff0c;依次将大的饼干满足给孩子。 贪心策略&#xff1a; 想一下局部最优&#xff0c;想一下全局最优&#xff0c;如果局部最优…...

Harmony鸿蒙类似与Android中broadcast广播的api使用及释义

EventHub模块提供了事件中心&#xff0c;提供订阅、取消订阅、触发事件的能力。 这里需要注意&#xff0c;该模块接口仅可在Stage模型下使用。且Api>9 EventHub.on on(event: string, callback: Function): void; 订阅指定事件。&#xff08;接收广播&#xff09; 参…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.

ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #&#xff1a…...

LOOI机器人的技术实现解析:从手势识别到边缘检测

LOOI机器人作为一款创新的AI硬件产品&#xff0c;通过将智能手机转变为具有情感交互能力的桌面机器人&#xff0c;展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家&#xff0c;我将全面解析LOOI的技术实现架构&#xff0c;特别是其手势识别、物体识别和环境…...

Linux部署私有文件管理系统MinIO

最近需要用到一个文件管理服务&#xff0c;但是又不想花钱&#xff0c;所以就想着自己搭建一个&#xff0c;刚好我们用的一个开源框架已经集成了MinIO&#xff0c;所以就选了这个 我这边对文件服务性能要求不是太高&#xff0c;单机版就可以 安装非常简单&#xff0c;几个命令就…...

Leetcode33( 搜索旋转排序数组)

题目表述 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...