分层解耦----

分层解耦

类聚

  • 软件中各个功能模块内部的功能联系.

  • 例如:

    • 高类聚示例:想象一下餐厅的厨房,每个厨师负责自己的工作站,一个专门做沙拉,一个专门烤肉,另一个专门做甜点。每个工作站内的工作高度类聚,即每个厨师只专注于自己的领域,不参与其他工作站的任务。在软件中,如果Controller层只负责接收请求和发送响应,不执行任何业务逻辑或数据处理,那么这就体现了高类聚性。

    • 低类聚示例:在同一个厨房中,如果每个厨师都要参与制作所有的菜品,那么工作站的类聚性就很低。在软件中,如果Controller层不仅要处理请求和响应,还要处理数据库操作、业务逻辑验证等,那么它就违反了高类聚的原则。

耦合

  • 衡量软件中各个层/模块的依赖关系.关联程度

  • 例如:

    • 低耦合示例:想象一下乐高积木,每个积木块都是独立的,可以轻松地与其他积木块组合或分离,而不影响其他块。在软件中,如果Service层只通过定义良好的接口与DAO层交互,而不直接访问DAO层的内部实现细节,那么这就体现了低耦合性。

    • 高耦合示例:在软件中,如果Service层直接访问和操作数据库,或者Controller层直接与数据库交互,而不是通过Service层或DAO层,那么这就形成了高耦合。这种情况下,任何对数据库结构的修改都可能影响到Service层或Controller层的代码,使得系统难以维护和扩展。

三层架构实例说明

  • 比起不用三层架构,原来方法,低类聚,高耦合.将所有操作写在Controller层,复用性差,维护性差

  • 使用三层架构后,类聚性明显提高,高耦合性降低.但是还是有耦合

###

IOC & DI入门

简介

  • IOC(Inversion of Control,控制反转)将对象的创建权由程序自身转移到外部(容器),这种思想称为控制反转

  • DI(Dependency Injection,依赖注入)是IOC的一种实现方式。依赖注入指的是在运行时,由外部容器动态地将依赖关系注入到对象中。

  • Bean对象:IOC容器中创建,管理的对象,称作Bean

Bean的注解(IOC)

类型注解说明使用位置备注
基础注解@Component声明bean的基础注解,用于非控制器、非业务逻辑、非数据访问类通用类最广泛使用的注解
控制器层级@Controller组件的衍生注解,用于标注Spring MVC中的控制器类控制器类处理HTTP请求
业务层级@Service组件的衍生注解,用于标注业务逻辑类业务类封装业务逻辑
数据访问层级@Repository组件的衍生注解,用于标注数据访问对象,如DAO数据访问类通常与ORM框架整合使用

@Component
  • 通过spring的@Component类注解将,某个实现类,交给IOC容器管理

@Component  //将EmpDaoA交给spring容器管理
public class EmpDaoA implements EmpDao {@Overridepublic List<Emp> listEmp() {//调用工具类解析xml文件String file = this.getClass().getClassLoader().getResource("emp.xml").getFile();//System.out.println(file);List<Emp> emps = XmlParserUtils.parse(file, Emp.class);return emps;}
}
注意事项
  • 声明bean时,可以通过value属性指定bean的名字,如果未指定,则默认使用类名的首字母小写形式作为bean的名称。

  • 在Spring Boot集成Web开发中,声明控制器bean时,只能使用@Controller注解,而不能使用其他注解。

DI(依赖注入)

@Autowired
  • 默认按照类型自动装配

  • 属性注入: 属性注入是最简单的方式,它允许你通过将 @Autowired 注解放在类的属性上来注入依赖。Spring 容器会自动查找合适的 Bean 并将其赋值给该属性。这种方式简单直观,但是它不支持不可变的对象(因为需要在构造器之外设置属性)。

    @Autowired
    private MyDependency myDependency;
     
  • 构造器注入: 构造器注入要求你提供一个带有参数的构造器,并在构造器上使用 @Autowired 注解。Spring 容器会自动调用这个构造器,并将所需的依赖作为参数传递给它。这种方式推荐用于必须的依赖,因为它可以保证在对象创建时就提供了所有必需的依赖,而且支持不可变对象。

    @Autowired
    public MyService(MyDependency myDependency) {this.myDependency = myDependency;
    }

  • 方法注入: 方法注入是一种更灵活的注入方式,它允许你在类的任意方法上使用 @Autowired 注解。Spring 容器会在创建 Bean 后调用标记了 @Autowired 的方法,并将所需的依赖作为参数传递。这种方式不常用于设置属性,而是用于初始化操作或配置方法。

    @Autowired
    public void setMyDependency(MyDependency myDependency) {this.myDependency = myDependency;
    }

多个同类型的Bean
  • @Primary

    • 类注解,将它加在某个类上,这是如果遇到相同的类型时会以它为准.

//这时如果冲突会以ServiceA为准
@Primary
@Service
public class ServiceA implements EmPS{......}
​
//
@Service
public class ServiceB implements EmPS{......}
​

  • @Autowired +@Qualifier("bean的名称")

@RestController
public class EmpController{@Autowired@Qualifier("ServiceB")EmPS emps;//......
}

  • @Resource(name = "bean的名称")

@RestController
public class EmpController{@Resource("ServiceB")EmPS emps;//......
}
  • @Resource 和 @Autowired 区别

    • @Autowired是spring框架提供的注解,而@Resource是JDK提供的注解

    • @Autowired默认按照类型注入,@Resource默认按照名称注入

Bean组件扫描

介绍
  • 组件扫描的必要性:要使@Component@Controller@Service@Repository等注解生效,需要通过组件扫描注解@ComponentScan来实现。

  • @ComponentScan注解

    • 通常不需要显式配置@ComponentScan

    • 在Spring Boot应用中,@SpringBootApplication注解已经包含了**@ComponentScan**

  • 默认扫描范围@ComponentScan默认扫描启动类所在的包以及其子包。

使用
  1. 显式指定扫描的包: 如果你希望Spring容器只扫描特定的包,可以在启动类或配置类上使用 @ComponentScan 并指定包路径。

    @ComponentScan("com.itheima.controller") // 只扫描com.itheima.controller包
  2. 使用通配符扫描多个包: 如果你想要扫描多个包,可以使用通配符。

    @ComponentScan("com.itheima.*") // 扫描com.itheima下的所有包
  3. 扫描多个具体的包: 如果你有多个包需要扫描,可以传递一个包路径数组。

    @ComponentScan({"com.itheima.controller","com.itheima.service"
    }) 
注意
  • 使用它会覆盖@SpringBootApplication的默认扫描.

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

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

相关文章

vite项目如何在本地启动https协议

vite项目如何在本地启动https协议 本地启动正常配置在vite.config.js文件中默认启动http协议的请求&#xff0c;如何改成https呢&#xff1f;今天的开发中遇到了这个问题项目需求&#xff1a; 本地启动https协议的前端页面并且正常访问后台https协议的接口 解决方法&#xff1a…

Elasticsearch:Runtime fields - 运行时字段(二)

这是继上一篇文章 “Elasticsearch&#xff1a;Runtime fields - 运行时字段&#xff08;一&#xff09;” 的续篇。 在查询时覆盖字段值 如果你创建的运行时字段与映射中已存在的字段同名&#xff0c;则运行时字段会隐藏映射字段。在查询时&#xff0c;Elasticsearch 会评估运…

MySQL 8.0新特性INTERSECT和EXCEPT用于集合运算

MySQL8.0.31 新版本的推出&#xff0c;MySQL增加了对SQL标准INTERSECT和EXCEPT运算符的支持。 1、INTERSECT INTERSECT输出多个SELECT语句查询结果中的共有行。INTERSECT运算符是ANSI/ISO SQL标准的一部分(ISO/IEC 9075-2:2016(E))。 我们运行两个查询&#xff0c;第一个会列…

Python基础小知识问答系列-获取列表中最大或最小N个元素

1. 问题: 怎么从数值列表中获取最大或最小几个元素&#xff1f; 怎么从字典元素列表中&#xff0c;获取字典中某个值最大或最小的几个字典元素&#xff1f; 2. 解决方法&#xff1a; 使用heapq模块中的nlargest、nsmallest。 示例&#xff1a; import heapqtest_list [1, 3…

java基于ssm+vue 病人跟踪治疗信息管理系统

1病人功能模块 病人登录进入病人跟踪治疗信息管理系统可以查看首页、个人中心、病例采集管理、预约管理、医生管理、上传核酸检测报告管理、上传行动轨迹管理、病人治疗状况管理等内容。 病例采集管理&#xff0c;在病例采集管理页面可以查看账号、姓名、住院号、入院时间、病…

电通出席2024年世界经济论坛(WEF),重申推动可持续发展创新和人才培育的承诺

中国&#xff0c;上海——电通将出席世界经济论坛2024年新领军者年会&#xff08;夏季达沃斯&#xff09;&#xff0c;本次大会将于6月25日至6月27日在中国大连举行。 2024年世界经济论坛主题为“未来增长的新前沿”&#xff0c;将聚焦于全球经济复苏、通胀缓解&#xff0c;以…

前端基础:JavaaScript(篇二)

目录 内置对象 String字符串 属性 代码 运行 方法 代码 运行 日期 代码 运行 Math 代码 运行 数组 定义 属性 代码 运行 方法 join(分隔符>) &#xff1a; 代码 运行 reverse()&#xff1a; 代码 运行 sort() &#xff1a; 代码 运行 事件 …

Elasticsearch实战教程: 如何在海量级数据中进行快速搜索

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 Elasticsearch&#xff08;简称ES&#xff09;是一个基于Apache Lucene™的开源搜索引擎&#xff0c;无论在开源还是专有领…

【SPIE独立出版】第四届智能交通系统与智慧城市国际学术会议(ITSSC 2024)

第四届智能交通系统与智慧城市国际学术会议&#xff08;ITSSC 2024&#xff09;将于2024年8月23-25日在中国西安举行。本次会议主要围绕智能交通、交通新能源、无人驾驶、智慧城市、智能家居、智能生活等研究领域展开讨论&#xff0c; 旨在为该研究领域的专家学者们提供一个分享…

SWOT视角洞察:一篇文章详解AI Agent发展

AI Agent自盖茨远见后火爆&#xff0c;吴恩达提出设计模式成创业圣经。其优势显著&#xff1a;技术门槛低&#xff0c;市场需求广&#xff0c;非技术人员可参与开发。然而&#xff0c;挑战亦不容忽视&#xff1a;技术成熟度需提升&#xff0c;数据安全和隐私保护待加强&#xf…

Linux shell编程学习笔记61: pstree 命令——显示进程树

0 前言 在 Linux shell编程学习笔记59&#xff1a; ps 获取系统进程信息&#xff0c;类似于Windows系统中的tasklist 命令https://blog.csdn.net/Purpleendurer/article/details/139696466?spm1001.2014.3001.5501 中我们研究了ps命令。在Linux中&#xff0c;通过ps命令&am…

【Hec-Ras】第一期:软件安装

Hec-Ras软件安装 1 HEC-RAS软件介绍2 HEC-RAS软件下载3 HEC-RAS软件安装4 HEC-RAS软件界面介绍参考 1 HEC-RAS软件介绍 HEC-RAS 是美国陆军工程兵团工程水文中心&#xff08; Hydrologic Engineering Centers, HEC&#xff09;开发的河道水力计算程序&#xff08;River Analys…

go sync包(五) WaitGroup

WaitGroup sync.WaitGroup 可以等待一组 Goroutine 的返回&#xff0c;一个比较常见的使用场景是批量发出 RPC 或者 HTTP 请求&#xff1a; requests : []*Request{...} wg : &sync.WaitGroup{} wg.Add(len(requests))for _, request : range requests {go func(r *Reque…

WebSocket解决方案(springboot 基于Redis发布订阅)

WebSocket 因为一般的请求都是HTTP请求&#xff08;单向通信&#xff09;&#xff0c;HTTP是一个短连接&#xff08;非持久化&#xff09;&#xff0c;且通信只能由客户端发起&#xff0c;HTTP协议做不到服务器主动向客户端推送消息。WebSocket确能很好的解决这个问题&…

基于SpringBoot的漫画网站系统

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;B/S架构模式、Java技术 工具&#xff1a;Visual Studio、MySQL数据库开发工具 系统展示 首页 用户…

零基础学习MySQL---MySQL入门

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、什么是数据库 问&#xff1a;存储数据用文件就可以了&#xff0c;为什么还要弄个数据库呢&#xff1f; 这就不得不提…

如何在《语文新读写》期刊上发表论文?

如何在《语文新读写》期刊上发表论文&#xff1f; 《语文新读写》知网 省级G4 3版面4800字符数 24年10-11月 可版权页查稿 出刊晚5个月 《语文新读写》栏目&#xff1a;视点_本期特稿、视点_百家争鸣、探索_教材新探、探索_阅读风向、探索_写作杂谈、实践_教法学法、实践_教…

【python】OpenCV—Feature Detection and Matching

参考学习来自OpenCV基础&#xff08;23&#xff09;特征检测与匹配 文章目录 1 背景介绍2 Harris角点检测3 Shi-Tomasi角点检测4 Fast 角点检测5 BRIEF 特征描述子6 ORB(Oriented Fast and Rotated Brief) 特征描述子7 SIFT(Scale Invariant Feature Transform) 特征描述子8 SU…

Milvus ConnectionRefusedError: how to connect locally

题意&#xff1a;怎样在本地连接到 Milvus 数据库。连接 Milvus 数据库被拒绝的错误 问题背景&#xff1a; I am trying to run a RAG pipeline using haystack & Milvus. 我正在尝试使用 haystack 和 Milvus 运行一个 RAG&#xff08;检索增强型生成&#xff09;管道。 …

vue+element-ui简洁完美实现个人博客“​响石潭 ​”

目录 一、项目介绍 二、项目截图 1.项目结构图 2.首页 3.生活 ​编辑 4.文章详情 ​编辑 5.关于我 ​编辑 ​编辑 三、源码实现 1.项目依赖package.json 2.项目启动 3.首页源码 四、总结 一、项目介绍 本项目在线预览&#xff1a;点击访问 参考官网&#xff1…