SpringBoot的三层架构以及IOCDI

目录

一、IOC&DI入门

二、三层架构 

数据库访问层

业务逻辑层

控制层


一、IOC&DI入门

在软件开发中,IOC(Inversion of Control)和DI(Dependency Injection)是密切相关的概念。

  1. IOC(控制反转): IOC是一种设计原则,通过它可以实现程序的松耦合。传统的控制流程是由程序员直接编写代码控制对象的创建和调用关系,而控制反转则是将这种控制权交给一个容器(例如,IOC容器)来管理。换句话说,控制反转就是控制权的转移,由程序员转移到容器中,容器负责创建对象并管理对象之间的依赖关系。

  2. DI(依赖注入): DI是实现IOC的一种具体方式。它是指在对象创建的过程中,通过将对象所依赖的其他对象(即依赖关系)注入到对象中,从而实现对象之间的解耦。这样,对象不再负责自己的依赖关系,而是由外部容器在创建对象时提供所需的依赖。

    依赖注入可以通过构造函数注入、属性注入或方法注入等方式来实现。其中最常见的是构造函数注入,在这种方式下,对象在创建时必须提供其所需的依赖,否则无法正确实例化对象。

综合起来说,IOC是一种设计原则,DI是实现IOC的具体技术手段。通过DI,我们可以在应用程序中实现控制反转,让对象之间的依赖关系由容器来管理,从而提高代码的可维护性、可测试性和灵活性。

要把某个对象交给IOC容器管理,需要在对应的类上加上如下注解之一:

注解说明位置
@Controller@Component的衍生注解标注在控制器类上
@Service@Component的衍生注解标注在业务类上
@Repository@Component的衍生注解标注在数据访问类上(由于与mybatis整合,用的少)
@Component声明bean的基础注解不属于以上三类时,用此注解

@Autowired注解,默认是按照类型进行自动装配的(去IOC容器中找某个类型的对象,然后完成注入操作)

入门程序举例:在EmpController运行的时候,就要到IOC容器当中去查找EmpService这个类型的对象,而我们的IOC容器中刚好有一个EmpService这个类型的对象,所以就找到了这个类型的对象完成注入操作。

二、三层架构 

那其实我们上述案例的处理逻辑呢,从组成上看可以分为三个部分:

  • 数据访问:负责业务数据的维护操作,包括增、删、改、查等操作。

  • 逻辑处理:负责业务逻辑处理的代码。

  • 请求处理、响应数据:负责,接收页面的请求,给页面响应数据。

按照上述的三个组成部分,在我们项目开发中呢,可以将代码分为三层:

  • Controller:控制层。接收前端发送的请求,对请求进行处理,并响应数据。

  • Service:业务逻辑层。处理具体的业务逻辑。

  • Dao:数据访问层(Data Access Object),也称为持久层。负责数据访问操作,包括数据的增、删、改、查。

基于三层架构的程序执行流程:  

  • 前端发起的请求,由Controller层接收(Controller响应数据给前端)

  • Controller层调用Service层来进行逻辑处理(Service层处理完后,把处理结果返回给Controller层)

  • Serivce层调用Dao层(逻辑处理过程中需要用到的一些数据要从Dao层获取)

  • Dao层操作文件中的数据(Dao拿到的数据会返回给Service层)

 

代码实现:

数据库访问层

public interface EmpDao {

    public List<Emp>  listEmp();

}
@Repository  // 将当前对象交给IOC容器管理,成为IOC容器的bean
public class EmpDaoA implements EmpDao {


    @Override
    public List<Emp> listEmp() {

        // 1、加载并解析xml文件
//        String file = this.getClass().getClassLoader().getResource("emp.xml").getFile();
        String file = "XXXXXXXXXXXXx";
        System.out.println(file); // 输出路径
        List<Emp> empList = XmlParserUtils.parse(file, Emp.class);


        return empList;
    }

}

业务逻辑层

// 业务逻辑层
public interface EmpService {

    public List<Emp> listEmp();

}

@Primary // 使用@Primary注解:当存在多个相同类型的Bean注入时,加上@Primary注解,来确定默认的实现。
@Service
public class EmpServiceA implements EmpService {

    // 创建数据库访问层对象
    @Autowired
    private EmpDao empDao;

    @Override
    public List<Emp> listEmp() {

        List<Emp> empList = empDao.listEmp();


        // 2、对数据转化处理
        empList.stream().forEach(emp -> {

            // 性别
            String gender = emp.getGender();

            if ("1".equals("gender")){
                emp.setGender("男");
            }
            else{
                emp.setGender("女");
            }
            String job = emp.getJob();

            if("1".equals(job)){

                emp.setJob("讲师");
            }
            else if("2".equals(job)){
                emp.setJob("班主任");
            }
            else
            {
                emp.setJob("就业指导");
            }


        });


        return empList;
    }


}

控制层


@RestController
public class EmpController {

    // 创建业务对象
    // 运行时,从IOC容器中获取该类型对象,赋值给该变量
    @Autowired
    private EmpService  empService;

    @RequestMapping("listEmp")
    public Result list(){


        List<Emp> empList = empService.listEmp();

        // 3、响应数据
        return Result.success(empList);
    }


}

三层架构的优点:

  1. 复用性强

  2. 便于维护

  3. 利用扩展

  4. 解决了耦合问题

首先需要了解软件开发涉及到的两个概念:内聚和耦合。

  • 内聚:软件中各个功能模块内部的功能联系。

  • 耦合:衡量软件中各个层/模块之间的依赖、关联的程度。

软件设计原则:高内聚低耦合。

高内聚指的是:一个模块中各个元素之间的联系的紧密程度,如果各个元素(语句、程序段)之间的联系程度越高,则内聚性越高,即 "高内聚"。

低耦合指的是:软件中各个层、模块之间的依赖关联程序越低越好。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【腾讯云 Cloud Studio 实战训练营】全新的开发方式,让你实现一站式开发

一、前言 关于 Cloud Studio 全在线云端开发 用户只需要浏览器就可以访问和使用Cloud Studio,无需在本地配置开发环境。Cloud Studio将开发环境部署在云服务器上,用户可以随时随地进行开发。多语言支持 Cloud Studio支持常见的开发语言,如Node.js、Python、Java、PHP等。用户…

Arcgis画等高线

目录 数据准备绘制等高线3D等高线今天我们将学习如何在ArcGIS中绘制等高线地图。等高线地图是地理信息系统中常见的数据表现形式,它通过等高线将地形起伏展现得一目了然,不仅美观,还能提供重要的地形信息。 数据准备 在开始之前,确保已经准备好了高程数据,它通常以栅格数…

11、PHP面向对象1

1、PHP的面向对象与其他语言类似&#xff0c;但也有不同。 PHP访问成员变量时&#xff0c;需要用“->”&#xff0c;而不能用“.”&#xff0c;访问成员函数时&#xff0c;需要用“->”&#xff0c;而不能用“.”。操作符“::”可以在没有任何声明实例的情况下访问类中的…

使用LangChain构建问答聊天机器人案例实战(二)

使用LangChain构建问答聊天机器人案例实战 逐行解读和验证全生命周期Prompting 现在我们使用GPT-4作为语言模型的驱动力,这个模型将成为整个应用程序的引擎,驱动整个应用程序运行,同时,应用程序也是基于Cpython去实现的,如图14-8所示,Pyodide是CPython到WebAssembly/Emsc…

jmeter实现webservice接口测试

其实可以用jmeter两种sampler进行webservice的测试&#xff1a; 1、SOAP/XML-RPC Request(但是在jmeter3.2以后版本中已经取消了这个取样器) 2、HTTP请求 下面分别介绍两种方式 一、首先需要使用soupUI工具抓取webservice接口的部分需要的信息。 1、新建项目 2、新建成功的…

htmlCSS-----定位

目录 前言 定位 分类和取值 定位的取值 1.相对定位 2.绝对位置 元素居中操作 3.固定定位 前言 今天我们来学习html&CSS中的元素的定位&#xff0c;通过元素的定位我们可以去更好的将盒子放到我们想要的位置&#xff0c;下面就一起来看看吧&#xff01; 定位 定位posi…

pytorch(续周报(1))

文章目录 2.1 张量2.1.1 简介2.1.2 创建tensor2.1.3 张量的操作2.1.4 广播机制 2.2 自动求导Autograd简介2.2.1 梯度 2.3 并行计算简介2.3.1 为什么要做并行计算2.3.2 为什么需要CUDA2.3.3 常见的并行的方法&#xff1a;网络结构分布到不同的设备中(Network partitioning)同一层…

【Linux多线程】详解线程控制、线程分离

线程互斥与同步 &#x1f478; 理解线程&#x1f934;pthead_t&#x1f977;关于线程&#x1f9b8;‍♀️线程控制POSIX线程库线程ID及进程地址空间布局 &#x1f9b8;线程分离__thread关键字&#x1f9b8;‍♂️pthread_detach函数&#x1f9b9;‍♀️pthread_exit函数&#x…

RNN架构解析——传统RNN模型

目录 传统RNN的内部结构图使用RNN优点和缺点 传统RNN的内部结构图 使用RNN rnnnn.RNN(5,6,1) #第一个参数是输入张量x的维度&#xff0c;第二个是隐藏层维度&#xff0c;第三层是隐藏层的层数 input1torch.randn(1,3,5) #第一个是输入序列的长度&#xff0c;第二个是批次的样本…

网络层IP协议的基本原理 数据链路层ARP协议 域名解析以及一些重要技术

目录 1 网络层IP协议协议头格式网段划分DHCPCIDR&#xff1a;基于子网掩码的划分方式特殊的IP号IP地址的数量限制私有IP地址和公网IP地址路由路由表 2 数据链路层 — 局域网的转发问题以太网认识以太网以太网帧格式局域网通信原理 MTUMTU对IP协议的影响MTU对UDP协议的影响MTU对…

自动化测试——APP测试

一、环境配置 1、安装jdk 配置环境变量 2、Android SDK 环境安装 3、Appium Server安装 4、模拟器安装 5、安装appium-python-client Python第三方库 二、APP自动化测试原理 三、Desired Capabilites——APPium自动化配置项 1、设置参数 2、操作系统 3、选择版本 4、设备名称…

CAN转EtherNet/IP网关can协议破解服务

JM-EIP-CAN 是自主研发的一款 ETHERNET/IP 从站功能的通讯网关。该产品主要功能是将各种 CAN 总线和 ETHERNET/IP 网络连接起来。 本网关连接到 ETHERNET/IP 总线中做为从站使用&#xff0c;连接到 CAN 总线中根据节点号进行读写。 技术参数 ETHERNET/IP 技术参数 网关做为 …

选择器jQuery

诚信是你价格不菲的鞋子&#xff0c;踏遍千山万水&#xff0c;质量也应永恒不变。 jQuery选择器大全总结&#xff1a; jQuery选择器是一种用于在HTML文档中选择元素的强大工具。下面是一些常用的jQuery选择器的总结&#xff1a; 基本选择器&#xff1a; 元素选择器&#xff1a…

HarmonyOS/OpenHarmony元服务开发-卡片使用动效能力

ArkTS卡片开放了使用动画效果的能力&#xff0c;支持显式动画、属性动画、组件内转场能力。需要注意的是&#xff0c;ArkTS卡片使用动画效果时具有以下限制&#xff1a; 以下示例代码实现了按钮旋转的动画效果&#xff1a; Entry Component struct AttrAnimationExample { St…

生命在于学习——APP渗透学习笔记

一、app渗透篇 1、Android 简介 自从 Android 被谷歌收购&#xff08;2005 年&#xff09;&#xff0c;谷歌已经完成了整个开发&#xff0c;在过去的 9 年里&#xff0c;尤其是在安全方面&#xff0c;有很多变化。 现在&#xff0c;它是世界上最广泛使用的智能手机平台&#…

PHP使用Redis实战实录4:单例模式和面向过程操作redis的语法

PHP使用Redis实战实录系列 PHP使用Redis实战实录1&#xff1a;宝塔环境搭建、6379端口配置、Redis服务启动失败解决方案PHP使用Redis实战实录2&#xff1a;Redis扩展方法和PHP连接Redis的多种方案PHP使用Redis实战实录3&#xff1a;数据类型比较、大小限制和性能扩展PHP使用Re…

IT技术面试必备:如何做好IT类技术面试?

博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客&#x1f466;&#x1f3fb; 《java 面试题大全》 &#x1f369;惟余辈才疏学浅&#xff0c;临摹之作或有不妥之处&#xff0c;还请读者海涵指正。☕&#x1f36d; 《MYSQL从入门到精通》数据库是开发者必会基础之…

tinkerCAD案例:25. 量角器 - 测量角度

tinkerCAD案例&#xff1a;25. 量角器 - 测量角度 原文 Now we’re going to make a protractor! A Protractor is one of the most basic, but essential, tools for making measurements. It is, then, surprising that the modern protractor is barely over 200 years ol…

神经网络简单介绍

人工神经网络(artififial neural network) 简称神经网络&#xff0c;它是一种模仿生物神经网络结构和功能的非线性数学模型。 神经网络通过输入层接受原始特征信息&#xff0c;再通过隐藏层进行特征信息的加工和提取&#xff0c;最后通过输出层输出结果。 根据需要神经网络可以…

【机器学习】Linear Regression

Model Representation 1、问题描述2、表示说明3、数据绘图4、模型函数5、预测总结附录 1、问题描述 一套 1000 平方英尺 (sqft) 的房屋售价为300,000美元&#xff0c;一套 2000 平方英尺的房屋售价为500,000美元。这两点将构成我们的数据或训练集。面积单位为 1000 平方英尺&a…