IOC-DI(分层解耦)

news2025/1/31 3:59:33

问题-引出

可以发现我们之前的代码但是写在我们的controller程序中
这里因为比较简单
但是如果我们开发一个比较复杂的功能的话-会出现大量操作数据的代码
导致代码的复用性较差
且难以维护
在这里插入图片描述

分层解耦

在这里插入图片描述

三层架构

在这里插入图片描述
按照上面的对应代码不同功能
来分为下面这三个架构
对应的controller和service和dao在不同的类里面便于维护和纠错
dao负责第一部分的数据访问
service负责第二部分逻辑处理
最后controller负责我们的发送响应和接收请求
在这里插入图片描述
但是其实我们dao接收的数据
可能来自xml文件或者数据库,或者别人给的一个接口
所以编写Dao之前先要编写一个Dao的接口

在这里插入图片描述

对应实现
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

解耦-相关概念

在这里插入图片描述
可以发现我们在对应的service和controller都创建了别的对象
那么以后我们要换service的实现
那么controller里面的代码也要变,三层的代码耦合在了一起
我们希望他们是内聚的怎么解决呢?

在这里插入图片描述
肯定要把new的操作删除
但是怎么获取对象呢
我们可以弄一个容器,如果controller需要的话
就从对应的容器取service对象
涉及两个问题
1.对象怎么让容器管理-IOC
2.容器怎么提供给controller所依赖的资源-DI

这里就涉及到IOC(控制反转)和DI(依赖注入)
在这里插入图片描述

IOC和DI入门(技术更新-看详解)

1.在service和dao类上
加上注解
@Component
表示把这个类交给IOC容器处理
完成控制反转操作
2.为controller和service注入依赖
需要在对应的成员变量是哪个加上注解
@AutoWired
完成依赖注入的操作
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

此时我们想切换实现比如ServiceA切换到ServiceB
只需要将A实现类上面的@Component注释掉
在B上加@Component
(当然这样肯定不是最新技术,下面会有新的讲解)
在这里插入图片描述

IOC详解

在这里插入图片描述

IOC(控制反转)
IOC容器内的对象都称为Bean对象(被IOC管理)
然后@Component是最底层的
spring中为了更好标识web开发中到底属于那一层
提供了对应@Component的衍生注解
@Controller(Controller),@Service(Service),@Repository(DAO)
在这里插入图片描述

@Compontent的衍生注解

@Compontent可以注释那种,不属于三层架构,但是想把他交给IOC容器管理的,典型的就是一些工具类
所以原来的代码可以改成
Controller注解
@RestController包含了@Controlller也就包含了@Compontent
在这里插入图片描述
service
在这里插入图片描述
DAO
在这里插入图片描述

其实@Controller,@Service,@Repository
都只封装了一个注解就是@Compontent
在这里插入图片描述
那些target,Retention和documented都是源注解

Bean的名字

默认如果你什么都不写的话
就是对应的类的首字母小写比如

在这里插入图片描述
在这里插入图片描述
但如果你想自己指定就这样,对应的名称会改(一般都是不该的)
在这里插入图片描述
在这里插入图片描述

Bean的组件扫描

在这里插入图片描述
在这里插入图片描述
可以看到启动类对应的注解包含了@ComponentScan就这个扫描器的
就是你的对应的注解要在和启动类在同一个包或者其子包下,才可以被扫描到
像这样的
在这里插入图片描述
我们的启动类则是在com.itheima下
在这里插入图片描述
所以检测不到外面的,会报错
解决方法
1.多写个注解@ComponentScan({“dao”,“com.itheima”})不推荐
这样的话bean不止会扫描com.itheima包下的,也会扫描dao包下的bean对象
在这里插入图片描述
2. 把包放规范一点
全放到启动类所在包的子包,就行
在这里插入图片描述

DI详解

在这里插入图片描述

@AutoWired
就自动装配,默认是按照类型装配的在这里插入图片描述

但是会出现一个问题EmpService是个接口,对应有两个实现EmpServiceA和EmpServiceB
对应如果EmpServiceA和EmpServiceB都宿舍Bean对象,就会报错(不知道选哪个)
在这里插入图片描述

解决方案
在这里插入图片描述
1.@Primary
优先呗
你加到EmpServiceA上A就优先生效
你加到EmpServiceB上B就优先生效
2.@Qualifier
用这个注解来指定我们需要用的Bean对象
放在@AutoWired头上
@Qualifier(“Bean对象名”)
在这里插入图片描述
3.@Resource
把@AutoWired替换成@Resource
autowired默认按类型注入
resource按Bean名称注入
有点类似第二种的组合
在这里插入图片描述

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

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

相关文章

Elasticsearch:跨集群复制应用场景及实操 - Cross Cluster Replication

通过跨集群复制(Cross Cluster Replication - CCR),你可以跨集群将索引复制并实现: 在数据中心中断时继续处理搜索请求防止搜索量影响索引吞吐量通过在距用户较近的地理位置处理搜索请求来减少搜索延迟 跨集群复制采用主动 - 被…

电商神器!教你如何利用数据分析打造销售奇迹!

能解决80%通用需求,提供销售、财务、广告、库存等电商数据分析主题的奥威BI电商数据分析方案一直都是比较神秘的存在。有说它风险低的,也有说它性价比高、效率高、可塑性高(支持个性化开发),但说到底,这份B…

企业机房如何管理电池?分享一个实操方法

在现代的信息化社会中,机房扮演着至关重要的角色,是许多组织和企业的核心基础设施。而机房的稳定供电则离不开可靠的电池系统作为备用电源。 电池的状态监控和管理一直是机房管理者面临的挑战。为了确保机房的可靠运行和及时发现电池问题,动环…

二、部署Git服务器-Windows环境部署Gitea

目录 1. 说明2. 环境准备3. 安装部署3.1 安装Git3.2 安装Gitea3.3 将 Gitea 注册为 Windows 服务(可选)3.4 启用 Gitea 内置的 SSH 服务器(可选)3.5 编辑 Windows 防火墙 Gitea是一个自托管的Git服务,类似于GitHub、Gi…

设计模式学习之策略模式和简单工厂模式的对比

设计模式系列往期文章 设计模式学习之策略模式设计模式学习之策略模式在前端的应用设计模式学习之简单工厂模式设计模式学习之工厂方法模式设计模式学习之抽象工厂模式 在这之前我们已经介绍过了策略模式和简单工厂模式,也清楚策略模式属于行为模式,简…

mysql字符集小总结

1.先看部分字符集 show variables like ‘character%’; 解释一下: character_set_client //客户端字符集 character_set_connection //连接字符集 character_set_database //mysql数据库字符集 character_set_filesystem //文件系统字符集 character_set_res…

普通相机标定——OpenCV函数讲解(上)

计算流程 我们使用OpenCV进行标定算法的开发,这里使用的是OpenCV3.4.6版本。使用OpenCV标定相机的算法流程如下。 Step1.检测之前采集的多张图像中的棋盘格角点像素坐标 Step2.利用棋盘格角点的像素坐标、世界坐标,计算相机的内参、畸变系数 Step3.利用相机的内参…

微信小程序web-view嵌入uni-app H5页面,通过H5页面跳转企业微信客户聊天窗口如何操作?

1、先找到企业ID和企业微信聊天接入链接 1)找到企业ID,登录 企业微信 https://work.weixin.qq.com/https://work.weixin.qq.com/ 2)找到接入链接 2、开始写H5页面代码 let d {corpId: ww931你挚爱的强哥8dee,//企业微信IDurl: https://…

[Visual Studio]Ctrl + T 跳转没有预览下拉选项的问题

最近一段时间,在用VS的CtrlT的跳转时,发现看不到下面的预览选项了。各种方式尝试无效。 最后发现原来下面的紫色区域,将鼠标悬停上去,是可以下拉的…

JavaScript(JS基础)

提示:JS的重点是让静态的页面产生一些变化 文章目录 JS编写方式嵌入编写外部编写 JS基本语法使用let声明变量使用var声明变量 JS中的数据类型JS中运算符❗ 和 JS中的数据类型转换字符串类型加减乘除布尔类型加减乘除 字符串与整数、小数之间的转换 JS流程控制语句 J…

【javascript】二维码

javascript二维码的生成可以用第三方库qrcode.js。 下载地址&#xff1a;https://gitcode.net/mirrors/davidshimjs/qrcodejs 解压后打开index.html文件输入百度地址回车&#xff0c;就可以看到指定页面的二维码了。 html代码&#xff1a; <!DOCTYPE html PUBLIC "-/…

2.Elasticsearch核心概念

一、Es中的核心概念 elasticsearch中有很多独有的概念,与mysql中略有差别,但也有相似之处 1.1文档和字段 一个文档就像数据库里的一条数据,字段就像数据库里的列 elasticsearch是面向文档(Document)存储的,可以是数据库中的一条商品数据,一个订单信息。文档数据会被序…

[Flink]wordcount

一、有界流 1、代码 package wc;import org.apache.flink.api.common.functions.FlatMapFunction; import org.apache.flink.api.java.functions.KeySelector; import org.apache.flink.api.java.tuple.Tuple2; import org.apache.flink.streaming.api.datastream.DataStream…

【UIAutomator2相关问题】UIAutomator2初始化无法自动安装ATX插件的解决方法

UIAutomator2初始化无法自动安装ATX插件的解决方法.md 文章目录 UIAutomator2初始化无法自动安装ATX插件的解决方法.md安装步骤第一步 安装 uiautomator-server第二步 安装 atx-agent第三步 点击ATX软件测试 总结 安装步骤 第一步 安装 uiautomator-server 在链接https://git…

提升搜索引擎效率:使用 Elasticsearch 别名

​ ​Elasticsearch 因其强大的搜索能力而备受推崇&#xff0c;使其成为构建高性能搜索引擎的热门选择。其中一个关键特性是使用别名&#xff0c;Elasticsearch 的别名为优化搜索操作、提升查询性能以及启用动态索引管理提供了强大的机制。在本文中&#xff0c;我们将探讨如何使…

如何选择最适合企业的自动化测试工具?

在软件开发过程中&#xff0c;测试是不可或缺的环节。而自动化测试工具则能够提高测试效率&#xff0c;减少人力成本&#xff0c;为企业带来更好的收益。但如何选择最适合企业的自动化测试工具呢&#xff1f;下面就为大家介绍一些选择自动化测试工具的方法和要点。 1.明确测试…

新版危废标签解读及制作教程分享

《HJ 1276-2022危险废物识别标志设置技术规范》&#xff08;以下简称为《规范》&#xff09;将于7月1日起正式实施。新的《规范》具体规定了产生、收集、贮存、利用、处置危险废物单位需设置的危险废物识别标志的分类、内容要求、设置要求和制作方法。 为方便企业更好地了解《…

AGRCZO-A-10/315先导比例减压阀放大器

AGRCZO-A-10/50、AGRCZO-A-10/100、AGRCZO-A-10/210/I、AGRCZO-A-10/315、AGRCZO-A-20/50、AGRCZO-A-20/100/U0/PE、AGRCZO-A-20/210、AGRCZO-A-20/315先导式比例减压阀 在比例溢流导阀2与主阀座0中间配有压力过载保护的手调溢流阀3。此阀流量范围比较大&#xff0c;一般用在系…

基于SpringBoot+vue的旅游管理系统设计与实现

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

大数据面试题:Zookeeper架构

面试题来源&#xff1a; 《大数据面试题 V4.0》 大数据面试题V3.0&#xff0c;523道题&#xff0c;679页&#xff0c;46w字 可回答&#xff1a; 1&#xff09;说一说Zookeeper中的角色 问过的一些公司&#xff1a;京东提前批(2020.07)&#xff0c;蘑菇街实习(2020.03) 参…