Java基础——分层解耦——IOC和DI入门
目录
三层架构
Controller
Service
Dao
编辑
调用过程
面向接口编程
分层解耦
耦合
内聚
软件设计原则
控制反转
依赖注入
Bean对象
如何将类产生的对象交给IOC容器管理?
容器怎样才能提供依赖的bean对象呢?

三层架构
Controller
控制层,也称为控制器,主要职责是接收前端发来的请求,并且给前端响应数据
Service
业务逻辑层,负责具体的业务逻辑处理
Dao
数据访问层,也叫持久层,负责数据访问操作,包括数据的增删改查
在mybatis中通常叫mapper
调用过程
浏览器发起请求先访问Controller,而Controller层仅仅负责接收请求响应数据,并不负责逻辑处理,所以Controller要去调用Service,Service再来进行逻辑处理,而Service进行逻辑处理的前提是要拿到数据,所以Service再来调用Dao,Dao再来访问文件,从文件中加载数据,Dao将数据加载回来后访问Service,Service再来对数据进行逻辑处理,逻辑处理完毕后再将处理后的数据返回给Controller,Controller再将数据响应给前端

面向接口编程
将来项目会升级,项目中的数据肯定不会在文件中存储,他是要存储在专门的数据库中这个时候又要定义一个dao,这个dao要从数据库中加载数据,也有可能项目中的数据来源于网络,这个时候要再定义一个dao,那么dao层就会有多种实现,多种实现加载的数据来源是不一样的。那在项目中为了提高程序的拓展性,便于项目的统一维护管理,我们通常会为dao的多种实现提供一个统一的接口,在接口中定义一个统一的规范,允许的不同的实现,各个实现来实现统一的接口,也就是面向接口编程

提供一个统一的接口

分层解耦
耦合
衡量软件中各个层/各个模块的依赖关联程度
业务层Service代码发生变化,Contrller层代码也要发生跟着变化,我们成为Controller和Service之间耦合了

内聚
软件中各个功能模块内部的功能联系
比如 userSerivice是用户信息操作的Service,这个类中只会去处理用户相关的逻辑,非用户相关的逻辑不会定义在这个类中,我们就说这个类的内聚程度较高,即高内聚
软件设计原则
高内聚低耦合
“高内聚”就是模块内部的联系越紧密越好,“低耦合”是指模块与模块||层与层之间要降低耦合,最好能做到解除耦合,也就是所谓的“解耦”
解耦后service层的代码变动是不会影响controller层的,dao层代码变动也不会影响service层,

想要解耦就不能去new对象,因为service层的代码发生变化,new对象代码部分也要跟着变化,那么层与层之间又耦合起来了

不去new对象,声明了这个对象默认值就是null,调用userService的list方法就会报空指针异常

如何做到不new对象解除耦合又能不报空指针异常呢?
提供一个容器用来存储一些对象,比如想用UserService这个实现类产生的对象,那就可以将这个实现类产生的对象交给容器来管理,在容器中就会产生UserService这个实现类产生的对象,也就是这个一号对象

Controller运行时需要用到UserService这个类型的对象,那么就可以从容器中查找这个对象,让容器给应用程序来提供这个类型的对象,

由此看来,即使Service类的类名发生了变化,或者切换了一个实现类,对于Controller层来说是不用动任何的代码,这样就完成了层与层的解耦
控制反转
简称IOC||Spring容器
对象的创建控制权由程序自身new转移到外部容器,这种思想成为控制反转
依赖注入
简称DI
容器为应用程序提供运行时所依赖的资源,这个过程称为依赖注入
Bean对象
在IOC容器中创建管理的对象,称之为Bean对象
如何将类产生的对象交给IOC容器管理?
在实现类上面加上注释@Conponent,代表将这个类交给IOC容器管理,由IOC容器来负责这个对象的创建

如果是mybatis统一的接口xxxMapper,则在接口上方加上注解@Mapper,代表程序运行时,会自动为这个接口创建一个实现类对象(代理对象),并自动将该实现类对象存入IOC容器中,成为IOC容器的bean对象

容器怎样才能提供依赖的bean对象呢?
在成员变量上加上注解@Autowired,会自动找到容器中UserDao类型的对象,并赋值给这个成员变量,这样就完成了依赖注入的过程。

相关文章:
Java基础——分层解耦——IOC和DI入门
目录 三层架构 Controller Service Dao 编辑 调用过程 面向接口编程 分层解耦 耦合 内聚 软件设计原则 控制反转 依赖注入 Bean对象 如何将类产生的对象交给IOC容器管理? 容器怎样才能提供依赖的bean对象呢? 三层架构 Controller 控制…...
DeepSeek-R1 本地部署教程(超简版)
文章目录 一、DeepSeek相关网站二、DeepSeek-R1硬件要求三、本地部署DeepSeek-R11. 安装Ollama1.1 Windows1.2 Linux1.3 macOS 2. 下载和运行DeepSeek模型3. 列出本地已下载的模型 四、Ollama命令大全五、常见问题解决附:DeepSeek模型资源 一、DeepSeek相关网站 官…...
Vue3学习笔记-模板语法和属性绑定-2
一、文本插值 使用{ {val}}放入变量,在JS代码中可以设置变量的值 <template><p>{{msg}}</p> </template> <script> export default {data(){return {msg: 文本插值}} } </script> 文本值可以是字符串,可以是布尔…...
csapp笔记3.6节——控制(1)
本节解决了x86-64如何实现条件语句、循环语句和分支语句的问题 条件码 除了整数寄存器外,cpu还维护着一组单个位的条件码寄存器,用来描述最近的算数和逻辑运算的某些属性。可检测这些寄存器来执行条件分支指令。 CF(Carry Flag)…...
PYH与MAC的桥梁MII/MIIM
在学习车载互联网时,看到了一句话,Processor通过DMA直接存储访问与MAC之间进行数据的交互,MAC通过MII介质无关接口与PHY之间进行数据的交互。常见的以太网硬件结构是,将MAC集成进Processor芯片,将PHY留在Processor片外…...
国内flutter环境部署(记录篇)
设置系统环境变量 export PUB_HOSTED_URLhttps://pub.flutter-io.cn export FLUTTER_STORAGE_BASE_URLhttps://storage.flutter-io.cn使用以下命令下载flutter镜像 git clone -b stable https://mirror.ghproxy.com/https://github.com/<github仓库地址>#例如flutter仓…...
选择排序_75. 颜色分类
75. 颜色分类 - 力扣(LeetCode) 题目不追求稳定 可以选择选择排序 这是我没看教程代码之前写的 有点复杂了 我还把元素后移了 class Solution { public:void sortColors(vector<int>& nums) {int min_num_index -1;int min_num 3;for(int i…...
C++ Primer 标准库vector
欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…...
C# 数组和列表的基本知识及 LINQ 查询
数组和列表的基本知识及 LINQ 查询 一、基本知识二、引用命名空间声明三、数组3.1、一维数组3.2、二维数组3.3、不规则数组 Jagged Array 四、列表 List4.1、一维列表4.2、二维列表 五、数组和列表使用 LINQ的操作和运算5.1、一维 LIST 删除所有含 double.NaN 的行5.2、一维 LI…...
大厂面试题备份20250201
20250201 面试策略 如果三面往后遇到传说中让人忍受不了的业余面试官,就舔着苟过去,入职大概率见不着他,但一二面遇到,反问环节就主动说不够match,让释放流程。 机器/深度学习 百面机器学习 5.4 通用CS 计算机网…...
w191教师工作量管理系统的设计与实现
🙊作者简介:多年一线开发工作经验,原创团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹赠送计算机毕业设计600个选题excel文…...
Git 版本控制:基础介绍与常用操作
目录 Git 的基本概念 Git 安装与配置 Git 常用命令与操作 1. 初始化本地仓库 2. 版本控制工作流程 3. 分支管理 4. 解决冲突 5. 回退和撤销 6. 查看提交日志 前言 在软件开发过程中,开发者常常需要在现有程序的基础上进行修改和扩展。但如果不加以管理&am…...
讲清逻辑回归算法,剖析其作为广义线性模型的原因
1、逻辑回归算法介绍 逻辑回归(Logistic Regression)是一种广义线性回归分析模型。虽然名字里带有“回归”两字,但其实是分类模型,常用于二分类。既然逻辑回归模型是分类模型,为什么名字里会含有“回归”二字呢?这是因为其算法原…...
数据结构(1)——算法时间复杂度与空间复杂度
目录 前言 一、算法 1.1算法是什么? 1.2算法的特性 1.有穷性 2.确定性 3.可行性 4.输入 5.输出 二、算法效率 2.1衡量算法效率 1、事后统计方法 2、事前分析估计方法 2.2算法的复杂度 2.3时间复杂度 2.3.1定义 2.3.2大O渐进表示法 2.3.3常见时间复…...
K8s运维管理平台 - xkube体验:功能较多
目录 简介Lic安装1、需要手动安装MySQL,**建库**2、启动命令3、[ERROR] GetNodeMetric Fail:the server is currently unable to handle the request (get nodes.metrics.k8s.io qfusion-1) 使用总结优点优化 补充1:layui、layuimini和beego的详细介绍1.…...
spring源码阅读系列文章目录
对于spring认识首先要了解 spring相关概念术语,然后是如下的几句话牢记并反射出来: Bean怎么来的,通过BeanDefinitionBeanDefinition有Spring框架内置的,有手动定义或者自动配置扫描出来的(写个Demo工程)B…...
快速提升网站收录:利用网站新闻发布功能
本文转自:百万收录网 原文链接:https://www.baiwanshoulu.com/63.html 利用网站新闻发布功能快速提升网站收录是一个有效的策略。以下是一些具体的建议,帮助你更好地利用这一功能: 一、保持新闻更新频率 搜索引擎尤其重视网站的…...
【14】WLC3504 HA配置实例
1.概述 本文档使用 Cisco WLC 3504 实现无线控制器的高可用性。这里所指的HA是指WLC设备box-to-box的冗余。换句话说,即1:1的设备冗余,其中一个 WLC 将处于Active活动状态,而第二个 WLC 将处于Standby-hot热待机状态,通过RP冗余端口持续监控活动 WLC 的运行状况。两个 WLC…...
什么是LPU?会打破全球算力市场格局吗?
在生成式AI向垂直领域纵深发展的关键节点,一场静默的芯片革命正在改写算力规则。Groq研发的LPU(Language Processing Unit)凭借其颠覆性架构,不仅突破了传统GPU的性能天花板,更通过与DeepSeek等国产大模型的深度协同&a…...
智慧物业管理系统实现社区管理智能化提升居民生活体验与满意度
内容概要 智慧物业管理系统,顾名思义,是一种将智能化技术融入社区管理的系统,它通过高效的手段帮助物业公司和居民更好地互动与沟通。首先,这个系统整合了在线收费、停车管理等功能,让居民能够方便快捷地完成日常支付…...
Wand-Enhancer终极指南:3步免费解锁WeMod Pro高级功能的完整方案
Wand-Enhancer终极指南:3步免费解锁WeMod Pro高级功能的完整方案 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/gh_mirrors/we/Wand-Enhancer 还在为WeMod专业版的订阅费…...
如何用Python快速接入Taotoken平台调用多模型API
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 如何用Python快速接入Taotoken平台调用多模型API 对于希望快速体验不同大模型能力的开发者而言,逐一对接各家厂商的API…...
LLM赋能网页抓取:基于ChatGPT的智能数据提取实战指南
1. 项目概述与核心价值最近在数据采集和自动化领域,一个名为“oxylabs/chatgpt-web-scraping”的项目引起了我的注意。乍一看,这像是把两个热门概念——大型语言模型(LLM)和网页抓取(Web Scraping)——强行…...
ARMv8 PMU架构与性能监控实战指南
1. ARMv8 PMU架构深度解析在ARMv8架构中,性能监控单元(Performance Monitor Unit, PMU)是处理器微架构层面的重要组件,它为开发者提供了硬件级别的性能数据采集能力。不同于传统的软件性能分析工具,PMU通过专用寄存器直接监控处理器内部事件&…...
量子通信中的级联环图码技术解析
1. 量子通信与量子中继器概述量子通信的核心挑战在于量子态在传输过程中极易受到环境噪声和信道损耗的影响。与传统经典通信不同,量子信息无法被简单地放大或复制(受限于量子不可克隆定理),这使得长距离量子通信的实现面临巨大困难…...
跨镜跟踪技术白皮书:ReID瓶颈与镜像无感解决方案
跨镜跟踪技术白皮书:ReID瓶颈与镜像无感解决方案前言在数字孪生、视频孪生、全域安防感知等领域,跨镜跟踪作为全域连续感知、目标轨迹溯源的核心技术,已成为智慧园区、工业厂区、城市治理、交通枢纽等场景落地的关键支撑。当前,行…...
基于数据科学的宠物性格分析:从行为量化到性格画像的工程实践
1. 项目概述与核心价值最近在逛GitHub的时候,发现了一个挺有意思的项目,叫petsonality。光看名字,你大概就能猜到它和“宠物”(Pets)以及“性格”(Personality)有关。没错,这是一个通…...
ARM JTAG-DP调试端口架构与工程实践解析
1. ARM JTAG-DP调试端口架构解析JTAG调试端口(JTAG-DP)作为ARM CoreSight调试架构的核心组件,为芯片调试提供了标准化访问接口。其设计基于IEEE 1149.1标准,但针对调试场景进行了专门优化。在实际工程中,理解JTAG-DP的工作原理对嵌入式系统调…...
官宣!网络安全法正式实施,人才缺口 327 万,这 5 类人直接站上风口,年薪百万不是梦
【必看收藏】网络安全人才抢夺战打响!新法实施后5类专业薪资翻倍,附学习路线 新《网络安全法》实施引爆网络安全人才市场,全球缺口480万,中国缺口327万以上。网络空间安全、信息安全、保密技术、网络安全科学与技术、信息对抗技术…...
2026 最稳高薪副业 + 主业赛道,网络安全零基础系统学习大纲,实战项目 + 证书考取 + 求职面试一站式教程
网络空间安全建设刻不容缓,已成为国家安全建设的重中之重。 随着境内外敌对势力的大规模安全事件,《国家网络空间安全战略》《网络安全法》《网络安全等级保护2.0》等一系列政策/法规/标准的持续落地,网络安全产业从小众产业逐步发展成为国家…...

