[javaweb]——spring框架之控制反转(IOC)与依赖注入(DI)

🌈键盘敲烂,年薪30万🌈

目录

一、概念介绍

二、示例演示

2.1 代码高内聚问题

2.2 三层架构

2.3 分层解耦

2.4 分层解耦的实现

📕总结


一、概念介绍

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

依赖注入:简称DI,容器为程序提供运行时所依赖的资料,称为依赖注入。

Bean对象:IOC容器中创建、管理的对象叫bean对象

二、原理讲解

2.1 代码高内聚问题

通过一个简单的示例带你一步步深入了解为什么要有控制反转和依赖注入。

三步:服务器收到客户端的请求,拿到数据,对数据进行逻辑处理,并返回数据,但这三个步骤我现在是把它写在了同一个类中,这样写就算我要改一行代码也要重写这个类中的所有代码,这就没达到高内聚,低耦合的设计理念。

2.2 三层架构

我们发现这三个功能是独立的,并且每一次请求响应都固定是这三步,我们可以创建三个接口分别实现三个功能,每个功能在web开发中有专业的叫法,看图

修改后的代码

2.3 分层解耦

耦合问题没有解决

但是这还有问题,当我要获取serviceA处理后的数据时,需要创建一个serviceA对象,当我要获取serviceB处理后的数据时,需要创建一个serviceB对象,(就例如service对性别进行逻辑处理1 0 代表男 女,serviceA处理为1 男 0 女 serviceB处理为1 男士 0 女士) 这是不是耦合了呀。

这样每次用不同的逻辑处理数据就要手动修改代码,创建不同的service对象,我们管这叫耦合

在看一下控制反转、依赖注入的概念

  • 控制反转:对象的创建控制权由程序自身转移到外部(容器)。
  • 依赖注入:容器为程序提供运行时所依赖的资料,称为依赖注入。

我们用到哪个对象,就把哪个对象添加到一个容器里,我们用到该对象就不需要直接创建了,从容器里面将该对象给程序里面的变量,这就达到了分层解耦的设计理念。

2.4 分层解耦的实现

加注解

@Component注解:将当前类交给IOC容器管理,成为IOC容器中的bean - 控制反转

@Aotuwired注解:运行时,IOC容器会提供该类型的bean对象 - 依赖注入

而针对不同的架构,Componen注解又衍生了三种注解

注意一个小细节:@RestController 这个注解包含了controller注解。

修改后的代码

//@Component //将当前类交给IOC容器管理,成为IOC容器中的bean
@Service
public class ServiceA implements EmpService {//数据的逻辑处理@Autowiredprivate EmpDao empDao;@Overridepublic List<Emp> listemp() {//调用empdao里的方法,获取数据List<Emp> list = empDao.listEmp();//……处理数据return list;}
}@RestController //这个注解包含了controller注解
public class EmpController {@Autowired //运行时,IOC容器会提供该类型的bean对象 - 依赖注入EmpService service;@RequestMapping("/listEmp")public Result listEmp(){//调用service对象中的service方法,获取处理后的数据List<Emp> list = service.listemp();//3.响应数据return Result.success(list);}
}//@Component //将当前类交给IOC容器管理,成为IOC容器中的bean
@Repository
public class EmpDaoA implements EmpDao {@Overridepublic List<Emp> listEmp() {//1.加载并解析XML文件String file = this.getClass().getClassLoader().getResource("emp.xml").getFile();System.out.println(file);List<Emp> list = XmlParserUtils.parse(file, Emp.class);return list;}
}

📕总结

最后缕一缕:1.由于代码的高内聚(多功能混一块了),我们设计了出三层架构模式,Controller Service Dao,2.但是代码的耦合问题(一个模块对另一模块有依赖)没有解决,于是就有了控制反转与依赖注入,这两步合起来就是分层解耦

  • 控制反转:简称IOC,对象的创建控制权由程序自身转移到外部(容器)
  • 依赖注入:简称DI,容器为程序提供运行时所依赖的资料。

控制反转和依赖注入是为代码加注解实现的

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

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

相关文章

DevChat:VSCode中的AI黑马

前言 编程对于很多人来说&#xff0c;可能是一件复杂且耗时的事情。在结合当下各类AI产品层出不穷的情况下&#xff0c;我是有在认真的去拥抱AI来结合我们的工作&#xff0c;帮助我们的工作提升效率&#xff0c;尝试过我们的官方G P T&#xff0c;以及各类国产AI产品&#xff…

Python 框架学习 Django篇 (六) ORM关联

像是上一章我们很少会通过页面点击去添加和绑定关系表&#xff0c;更多的时候都是通过django的语法实现&#xff0c;接下来我们做一个案例 django rom是怎么操作外键关系的 创建mode模型表 Django_demo/mgr/models.py # 国家表 class Country(models.Model):name models.Cha…

ubuntu安装nps客户端

Ubuntu安装nps客户端 1.什么是nps内网穿透&#xff1f;2.设备情况3.下载客户端3.链接服务端3.1、无配置文件模式3.2、注册到系统服务(启动启动、监控进程) 1.什么是nps内网穿透&#xff1f; nps是一款轻量级、高性能、功能强大的内网穿透代理服务器。目前支持tcp、udp流量转发…

底层全部重构,小米澎湃OS完整系统架构公布

上周&#xff0c;雷军发文称小米全新操作系统澎湃 OS 正式版已完成封包&#xff0c;将逐步接替 MIUI。而后&#xff0c;又有网友曝光小米澎湃 OS 界面。 今日&#xff0c;雷军再度发表长文预热小米澎湃 OS&#xff0c;正式公布了完整系统架构。 据介绍&#xff0c;从架构设计之…

平衡二叉树AVL的插入删除

在AVL树的插入操作中&#xff0c;假设插入一个结点后&#xff0c;当前节点p的平衡因子是&#xfe63;2&#xff0c;其左子结点的平衡因子是&#xff0b;1&#xff0c;左子结点的右子结点的平衡因子是&#xfe63;1。如图所示&#xff0c;请给出票转调整之后的结构。

phpstorm2022.3.3和xdebug 3 调试代码记录

有鉴于之前使用log日志调试代码&#xff0c;或者var_dump()调试代码太慢了&#xff0c;系统出了问题排查效率低下。最终决定使用xdebug工具提高效率。总结如下&#xff1a; 1. xdebug版本要和phpstorm兼容&#xff0c; 这里使用xdeubug 3.1.6&#xff0c;phpstorm 2022.3.3 (破…

Makefile三个版本的编写

1.Makefile Makefile是一个工程管理文件&#xff0c;简化编译的流程&#xff0c;完成自动化编译的过程 在Makefile中&#xff0c;会把编译的过程分为两步&#xff0c;先生成.o文件&#xff0c;再对.o文件链接&#xff0c;生成可执行文件 Makefile由变量、函数、和规则构成 2.引…

TSINGSEE青犀睡岗离岗检测算法——确保加油站安全运营

众所周知&#xff0c;加油站是一个需要24小时营业的场所&#xff0c;由于夜间加油人员较少&#xff0c;员工极易处于疲劳或者睡眠状态&#xff0c;为保障安全和效率&#xff0c;通过TSINGSEE青犀睡岗离岗检测算法在加油站场景中&#xff0c;可以及时发现工作人员的疲劳状况&…

SpringCloud 微服务全栈体系(五)

第七章 Feign 远程调用 先来看我们以前利用 RestTemplate 发起远程调用的代码&#xff1a; 存在下面的问题&#xff1a; 代码可读性差&#xff0c;编程体验不统一 参数复杂 URL 难以维护 Feign 是一个声明式的 http 客户端&#xff0c;官方地址&#xff1a;https://github.…

2.21每日一题(隐函数求导+变上限积分求导)

1、首先 t 0 时&#xff0c;x ? 或者 y ? 求出来 2、等式两边进行一阶求导&#xff0c;把一阶导函数&#xff08;隐函数求导&#xff09;求出来 3、等式两边再次求导&#xff0c;把二阶导函数&#xff08;隐函数求导&#xff09;求出来 注意&#xff1a;隐函数求导及变上…

基于数字电路交通灯信号灯控制系统设计-单片机设计

**单片机设计介绍&#xff0c;1617基于数字电路交通灯信号灯控制系统设计&#xff08;仿真电路&#xff0c;论文报告 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序文档 六、 文章目录 一 概要 交通灯控制系统在城市交通控制中发挥着重要的作用&#xf…