三层架构与分层解耦

2024-06-16 11:12
文章标签 分层 架构 三层

本文主要是介绍三层架构与分层解耦,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

三层架构与分层解耦

一、三层架构

三层架构分别是

  • Controller层 (控制层) : 接收请求,响应数据
  • Service层 (业务逻辑层): 业务逻辑处理
  • Repository层 (数据访问层,持久层):数据访问操作

由于我们的规范是一个函数只做一件事情,所以才会细 分出以上的三层架构

  • 以下是没有经过三层架构优化的实现
@RequestMapping("/listEmp") 
public Result list(){//1. 加载并解析emp.xmlString file = this.getClass().getClassLoader().getResource("emp.xml").getFile();System.out.println(file);List<Emp> empList = XmlParserUtils.parse(file, Emp.class);//2. 对数据进行转换处理 - gender, jobempList.stream().forEach(emp -> {//处理 gender 1: 男, 2: 女String gender = emp.getGender();if("1".equals(gender)){emp.setGender("男");}else if("2".equals(gender)){emp.setGender("女");}//处理job - 1: 讲师, 2: 班主任 , 3: 就业指导String job = emp.getJob();if("1".equals(job)){emp.setJob("讲师");}else if("2".equals(job)){emp.setJob("班主任");}else if("3".equals(job)){emp.setJob("就业指导");}});//3. 响应数据return Result.success(empList);}

从上面我们跨域看出

  • dao层 :加载并解析emp.xml
  • service层: 对数据进行转换处理
  • controller层:响应数据

我们发现三层都放在了一起,这样显得程序可维护性不高

  • 以下是经过三层解耦后的实现
//controller层
@RequestMapping("/listEmp")public Result list(){//1. 调用service, 获取数据List<Emp> empList = empService.listEmp();//3. 响应数据return Result.success(empList);}
//封装service层
public class EmpServiceA implements EmpService {private EmpDao empDao = new EmpDaoA();@Overridepublic List<Emp> listEmp() {//1. 调用dao, 获取数据List<Emp> empList = empDao.listEmp();//2. 对数据进行转换处理 - gender, jobempList.stream().forEach(emp -> {//处理 gender 1: 男, 2: 女String gender = emp.getGender();if("1".equals(gender)){emp.setGender("男");}else if("2".equals(gender)){emp.setGender("女");}//处理job - 1: 讲师, 2: 班主任 , 3: 就业指导String job = emp.getJob();if("1".equals(job)){emp.setJob("讲师");}else if("2".equals(job)){emp.setJob("班主任");}else if("3".equals(job)){emp.setJob("就业指导");}});return empList;}
}
public class EmpDaoA implements EmpDao {@Overridepublic List<Emp> listEmp() {//1. 加载并解析emp.xmlString file = this.getClass().getClassLoader().getResource("emp.xml").getFile();System.out.println(file);List<Emp> empList = XmlParserUtils.parse(file, Emp.class);return empList;}
}

这样就显得条例清晰,利于维护

二、分层解耦

在我们使用三层架构时,还需要配合解耦来进一步实现代码的可维护性

分层解耦的三个关键点:

  • 控制反转:Inversion of Control ,简称IOC,对象的创建控制权转移到外部容器(这里spring容器),这种思想成为控制反转:
  • 依赖注入:Dependency Injection,简称DI,容器为应用程序提供运行时所提供的资源,称为依赖注入
  • Bean对象:IOC容器中创建,管理的对象称之为Bean对象

怎么创建bean对象

我们使用注释管理起来的对象,函数都会被放进spring容器中管理,我们称放入放入容器中管理的为Bean

分层解耦会使用到的注释

注解类别注解名称用途说明
类级别注解@Component标识一个类作为组件类,Spring会自动为这些类创建bean。
@Service标识一个类作为服务层组件,其本质还是@Component,但意图更为明确。
@Repository标识一个类作为数据访问层组件,它也是@Component的特化,可以用来捕获持久层的异常。
@Controller标识一个类作为控制器组件,用于处理HTTP请求。
@RestController组合了@Controller@ResponseBody,用于创建RESTful控制器。
@Configuration标识一个类作为配置类,可包含一个或多个@Bean定义。
方法级别注解@Bean在配置类中,标识一个方法用于创建一个bean,方法返回的对象将由Spring容器管理。
@RequestMapping用于将HTTP请求映射到特定的处理函数上。
@GetMapping快捷方式,用于处理HTTP的GET请求。
@PostMapping快捷方式,用于处理HTTP的POST请求。
@PutMapping快捷方式,用于处理HTTP的PUT请求。
@DeleteMapping快捷方式,用于处理HTTP的DELETE请求。
字段/参数级别注解@Autowired自动注入依赖,Spring会在容器中查找匹配的组件注入。
@Qualifier当存在多个同一类型的bean时,用于指定注入哪一个。
@Resource@Autowired相似,但它可以更精确地通过名称来指定注入的bean。
@Value用于注入表达式驱动的值,如配置文件中的值。
条件注入和环境配置@Profile指定某个组件在给定的环境下才会被创建。
@Conditional根据满足的条件,Spring决定是否创建一个bean。
生命周期相关注解@PostConstruct标识一个方法,在bean创建并完成依赖注入后执行。
@PreDestroy标识一个方法,在bean销毁之前执行。

注意,我们在遇到一个接口,多个实现时需要指定Bean,这样才不会出错

我们常用@Qualifier@Resource和进行使用

例如

@RestController
public class EmpController {//    @Qualifier("empServiceA")
//    @Autowired //运行时, IOC容器会提供该类型的bean对象,并赋值给该变量 - 依赖注入
//    private EmpService empService ;@Resource(name = "empServiceB")private EmpService empService ;@RequestMapping("/listEmp")public Result list(){//1. 调用service, 获取数据List<Emp> empList = empService.listEmp();//3. 响应数据return Result.success(empList);}
}

问,@Resource和@Autowired有什么区别

  • @Autowired时springboot框架提供的,而@Resource是由JDK提供的
  • @Autowired默认是按照类型注入的,而@Resource默认是按照名称注入的

这篇关于三层架构与分层解耦的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1066307

相关文章

MySQL 缓存机制与架构解析(最新推荐)

《MySQL缓存机制与架构解析(最新推荐)》本文详细介绍了MySQL的缓存机制和整体架构,包括一级缓存(InnoDBBufferPool)和二级缓存(QueryCache),文章还探讨了SQL... 目录一、mysql缓存机制概述二、MySQL整体架构三、SQL查询执行全流程四、MySQL 8.0为何移除查

微服务架构之使用RabbitMQ进行异步处理方式

《微服务架构之使用RabbitMQ进行异步处理方式》本文介绍了RabbitMQ的基本概念、异步调用处理逻辑、RabbitMQ的基本使用方法以及在SpringBoot项目中使用RabbitMQ解决高并发... 目录一.什么是RabbitMQ?二.异步调用处理逻辑:三.RabbitMQ的基本使用1.安装2.架构

mybatis的整体架构

mybatis的整体架构分为三层: 1.基础支持层 该层包括:数据源模块、事务管理模块、缓存模块、Binding模块、反射模块、类型转换模块、日志模块、资源加载模块、解析器模块 2.核心处理层 该层包括:配置解析、参数映射、SQL解析、SQL执行、结果集映射、插件 3.接口层 该层包括:SqlSession 基础支持层 该层保护mybatis的基础模块,它们为核心处理层提供了良好的支撑。

百度/小米/滴滴/京东,中台架构比较

小米中台建设实践 01 小米的三大中台建设:业务+数据+技术 业务中台--从业务说起 在中台建设中,需要规范化的服务接口、一致整合化的数据、容器化的技术组件以及弹性的基础设施。并结合业务情况,判定是否真的需要中台。 小米参考了业界优秀的案例包括移动中台、数据中台、业务中台、技术中台等,再结合其业务发展历程及业务现状,整理了中台架构的核心方法论,一是企业如何共享服务,二是如何为业务提供便利。

系统架构设计师: 信息安全技术

简简单单 Online zuozuo: 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo :本心、输入输出、结果 简简单单 Online zuozuo : 文章目录 系统架构设计师: 信息安全技术前言信息安全的基本要素:信息安全的范围:安全措施的目标:访问控制技术要素:访问控制包括:等保

利用命令模式构建高效的手游后端架构

在现代手游开发中,后端架构的设计对于支持高并发、快速迭代和复杂游戏逻辑至关重要。命令模式作为一种行为设计模式,可以有效地解耦请求的发起者与接收者,提升系统的可维护性和扩展性。本文将深入探讨如何利用命令模式构建一个强大且灵活的手游后端架构。 1. 命令模式的概念与优势 命令模式通过将请求封装为对象,使得请求的发起者和接收者之间的耦合度降低。这种模式的主要优势包括: 解耦请求发起者与处理者

创业者该如何设计公司的股权架构

本文来自七八点联合IT橘子和车库咖啡的一系列关于设计公司股权结构的讲座。 主讲人何德文: 在公司发展的不同阶段,创业者都会面临公司股权架构设计问题: 1.合伙人合伙创业第一天,就会面临股权架构设计问题(合伙人股权设计); 2.公司早期要引入天使资金,会面临股权架构设计问题(天使融资); 3.公司有三五十号人,要激励中层管理与重要技术人员和公司长期走下去,会面临股权架构设计问题(员工股权激

【系统架构设计师】黑板架构详解

黑板架构(Blackboard Architecture)是一种软件架构模式,它模仿了多个专家系统协作解决问题的场景。在这种架构中,“黑板”作为一个中央知识库,存储了问题的当前状态以及所有的解决方案和部分解决方案。黑板架构特别适合于解决那些没有确定算法、需要多个知识源(或称为“专家”)共同作用才能解决的复杂问题。 一、黑板架构的组成 黑板架构主要由以下几个部分组成: 黑板(Blackboa

JavaEE应用的分层模型

不管是经典的JAVAEE架构,还是轻量级JavaEE架构,大致上都可以分为如下几层: 1、Domain Object(领域对象)层:此层由一系列的POJO(Plain Old Java Object)组成,这些对象是该系统的Domain Object,往往包含了各自所需实现的业务逻辑方法。 2、DAO(Data Access Object,数据访问对象)层:此层由一系列的DAO组件组成,这些D

可测试,可维护,可移植:上位机软件分层设计的重要性

互联网中,软件工程师岗位会分前端工程师,后端工程师。这是由于互联网软件规模庞大,从业人员众多。前后端分别根据各自需求发展不一样的技术栈。那么上位机软件呢?它规模小,通常一个人就能开发一个项目。它还有必要分前后端吗? 有必要。本文从三个方面论述。分别是可测试,可维护,可移植。 可测试 软件黑盒测试更普遍,但很难覆盖所有应用场景。于是有了接口测试、模块化测试以及单元测试。都是通过降低测试对象