Web后端开发中对三层架构解耦之控制反转与依赖注入

内聚与耦合

内聚 比如说我们刚刚书写的员工的实现类

在这里我们仅仅书写的是和员工相关的代码

而与员工无关的代码都没有放到这里

说明内聚程度较高

耦合

以后软件开发要高内聚 低耦合

提高程序灵活性 扩拓展性

分析代码

如何解耦

创建容器

提供一个容器 存储东西 存储EmpService类的实现

EmpController直接去容器中去找 又没有这个对象 复制给empService

有没有这个对象

控制反转与依赖注入

Springboot中很重要的概念

意思是如何操作运用容器

控制反转

是对象的创建控制权由应用程序转移到了外部容器 这个容器叫spring容器 ioc容器

依赖注入

是容器为应用程序提供运行时依赖的资源

Bean对象

表示IOC容器中创建管理的对象

IOC与DI的入门

控制反转和依赖注入的代码实现

我们需要完成controller层与service层的解耦

还有service层与dao层的解耦

具体代码程序

service层和dao层解耦 controller层和service层解耦

将两层中的对象删掉

程序会爆空指针异常

我们此时就需要用IOC和DI完成解耦操作

第一步 控制反转

第二步 需要ioc容器为其提供bean对象

启动springboot

部署后就可以访问服务端

如果以后我们在业务操作中要改变实现类

直接将需要交给控制层的核心逻辑层加上Component注释就行

再取消之前的实现类的注释

代表将当前实现类交给Bean容器管理

小结

控制反转:Component注解

将当前类交给IOC容器管理 成为IOC容器里的bean

依赖注入:Autowired注解

运行时,IOC容器会提供该类型的bean对象,并复制给该对象

代码实现

(只写了实现类)

package com.bigdate.threetier_architecture.dao.impl;import com.bigdate.threetier_architecture.dao.EmpDao;
import com.bigdate.threetier_architecture.pojo.Emp;
import com.bigdate.threetier_architecture.util.XmlParserUtils;
import org.springframework.stereotype.Component;import java.util.List;//交给ioc容器处理 控制反转 称为ioc容器中的bean
@Component
public class EmpDaoA implements EmpDao {@Overridepublic List<Emp> listEmp() {String file=this.getClass().getClassLoader().getResource("emp.xml").getFile();List<Emp>empList= XmlParserUtils.parse(file,Emp.class);return empList;}
}
package com.bigdate.threetier_architecture.service.impl;import com.bigdate.threetier_architecture.dao.EmpDao;
import com.bigdate.threetier_architecture.dao.impl.EmpDaoA;
import com.bigdate.threetier_architecture.pojo.Emp;
import com.bigdate.threetier_architecture.service.EmpService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import java.util.List;//交给ioc容器处理 控制反转 称为ioc容器中的bean
@Component
public class EmpServiceA implements EmpService {@Autowired//程序在运行时 ioc会提供该类型的bean对象 并赋值给该对象 依赖注入private EmpDao empDao;@Overridepublic List<Emp> listEmp() {List<Emp> empList=empDao.listEmp();empList.stream().forEach(emp -> {//处理genderString gender=emp.getGender();if(gender.equals("1")){emp.setGender("男");}else emp.setGender("女");//处理jobString job=emp.getJob();if(job.equals("1")){emp.setJob("学生");}else emp.setJob("老师");});return empList;}
}
package com.bigdate.threetier_architecture.controller;import com.bigdate.threetier_architecture.pojo.Emp;
import com.bigdate.threetier_architecture.pojo.Result;
import com.bigdate.threetier_architecture.service.EmpService;
import com.bigdate.threetier_architecture.service.impl.EmpServiceA;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;@RestController
public class Controller {@Autowired//程序在运行时 ioc会提供该类型的bean对象 并赋值给该对象 依赖注入private EmpService empService;@RequestMapping("/listEmp")public Result list(){//调用service响应数据 再响应数据List<Emp> empList=empService.listEmp();//响应数据return Result.success(empList);}
}

IOC详解

概念

控制反转

将对象的容器交给IOC容器 由IOC容器创建管理这些对象

而IOC容器里这些对象又是bean对象

Component注解可以适用于一些工具类

实操

我们之前开发的后端架构其实就已经交给IOC容器管理

注解RestController

启动Springboot

Component的衍生注解 底层都封装了原注解和Component

bean容器默认是类名小写

Bean的声明

Bean的组件扫描

把数据层移出去 运行就会报错 因为找不到bean了

这里有个隐式注解

启动类当前包以及子包 搭建架构的常见错误

我们要加注解

这种解决方案不规范

我们在实际开发中应该按照springboot的规范来书写代码

启动类是放在总工程包下

而于启动类同级的是不同业务层的包 里面有接口和实现类

小结

DI详解

依赖注入

IOC容器要为运行程序提供需要的资源 资源即对象

自动装配

会去IOC容器中自动找这种类型的对象

然后赋值给对象

如果说往IOC容器里放入了两个同类型的对象

依赖注入时就会报错

解决

Primary注解

设置优先级

Autowired+Qualifier注解

指定bean的名字

如果说声明bean的时候默认没有设置

那就是类名小写

Resource注解

Autowired是按照类型注入的

而Resource是按照名称注入的

小结

面试题

@Resource@Autowired 是 Java 中用于依赖注入的注解,它们的主要区别如下:

  1. 来源:

    • @Resource 是 Java EE 提供的注解,在 javax.annotation 包中。
    • @Autowired 是 Spring Framework 提供的注解,在 org.springframework.beans.factory.annotation 包中。
  2. 用途:

    • @Resource 旨在通过名称进行依赖注入。它默认按照名称进行匹配,如果指定了 name 属性,则按照指定名称进行匹配。
    • @Autowired 旨在通过类型进行依赖注入。它默认按照类型进行匹配,如果多个匹配项,则会尝试按照名称进行匹配。
  3. 配置:

    • @Resource 可以通过 name 属性指定要注入的 Bean 的名称,也可以直接应用在字段、setter 方法或构造方法上。
    • @Autowired 可以应用在字段、构造方法、setter 方法上,通过类型匹配自动注入 Bean。
  4. 依赖性:

    • @Resource 是 Java EE 的标准注解,不依赖于 Spring,可以在非 Spring 容器中使用。
    • @Autowired 是 Spring 特有的注解,依赖于 Spring 框架,需要在 Spring 容器中才能生效。

总体而言,如果你想按照名称进行注入,可以使用 @Resource;如果你想按照类型进行注入,并且在 Spring 环境中使用,通常会选择 @Autowired

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

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

相关文章

STM32 F103C8T6学习笔记16:1.3寸OLED的驱动显示日历

今天尝试使用STM32 F103C8T6驱动显示 1.3寸的OLED&#xff0c;显示数字、字符串、汉字、图片等 本质与0.96寸的OLED是完全相同的原理&#xff1a; 而且经过我的研究发现: 1.3寸大小的OLED并未比0.96寸的有更多的显示像素点数来显示&#xff0c;也是128*64的像素点数显示: 也…

AI期末复习(PolyU)

文档详见评论链接 Tutorial 2-Search Algorithm Breadth-first search宽度优先搜索 [图片] [图片] open表由queue队列实现&#xff0c;因此加在尾部。 [图片] Depth-first search深度优先搜索 [图片] [图片] open表由stack栈实现&#xff0c;因此加在头部。 [图片] Hill climbi…

【设计模式】之单例模式

系列文章目录 【设计模式】之责任链模式【设计模式】之策略模式【设计模式】之模板方法模式 文章目录 系列文章目录 前言 一、什么是单例模式 二、如何使用单例模式 1.单线程使用 2.多线程使用&#xff08;一&#xff09; 3.多线程使用&#xff08;二&#xff09; 4.多线程使用…

uni框架下的前端小知识

<movable-area> 和 <movable-view> 组件来创建一个可以移动的区域&#xff0c;这通常用于模拟地图或座位图等场景的拖动效果。 1、direction&#xff1a;移动方向&#xff0c;可选值为all、vertical、horizontal分别表示所有方向、垂直、水平方向。 2、inertia&am…

力扣153. 寻找旋转排序数组中的最小值

Problem: 153. 寻找旋转排序数组中的最小值 文章目录 题目描述思路复杂度Code 题目描述 思路 1.初始化左右指针left和right&#xff0c;指向数组的头和尾&#xff1b; 2.开始二分查找&#xff1a; 2.1.定义退出条件&#xff1a;当left right时退出循环&#xff1b; 2.2.当nums…

Python爬虫-BeautifulSoup解析

1.简介 BeautifulSoup 是一个用于解析 HTML 和 XML 文档的 Python 库。它提供了一种灵活且方便的方式来导航、搜索和修改树结构或标记文档。这个库非常适合网页抓取和数据提取任务&#xff0c;因为它允许你以非常直观的方式查询和操作文档内容。 2.安装 Beautiful Soup 终端输…

docker学习笔记5:Docker Compose安装与使用

Docker Compose 简介 Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它使用一个 YAML 文件来配置应用服务,这样可以通过一个简单的命令创建和启动所有服务。Docker Compose 主要面向开发环境、自动化测试环境和小型生产部署。 Docker Compose 的主要特…

Time_embedding采样的理解

简单概括&#xff0c;就是t越大&#xff0c;采样得到的点越分散&#xff0c;采样得到的点范围更广 一个简单的示例函数 def time_embedding(t, max_steps1000):frequency np.linspace(0, 1, max_steps)embeddings np.concatenate([np.sin(frequency * t * math.pi),np.cos(f…

【笔记】 - Git

一、安装 https://git-scm.com/ 下载 下一步下一步 二、clone 到本地 1、git clone [url] Git 会按照你提供的 URL 所指向的项目的名称创建你的本地项目目录。 通常就是该 URL 最后一个 / 之后的项目名称。如果你想要一个不一样的名字&#xff0c; 你可以在该命令后加上你想要…

【webrtc】RemoteAudioSource的创建线程

m98 代码&#xff1a;I:\webrtc m98_yjf\src\pc\rtp_transmission_manager.cc RtpTransmissionManager::CreateReceiver 在信令线程创建receiver receiver 是&#xff1a; rtc::scoped_refptr<RtpReceiverProxyWithInternal<RtpReceiverInternal>>receiver;其实际…

可视化大屏在真实场景的效果,绝对震撼,不要再嘲笑其作用了

hello&#xff0c;我是大千UI工场&#xff0c;本地带来一批可视化大屏现场效果图&#xff0c;非常震撼&#xff0c;给大家带来身临其境的感受&#xff0c;欢迎关注点赞&#xff0c;有需求请私信。 有人可能会认为可视化大屏没有太多价值&#xff0c;可能是因为以下几个原因&am…

记录PR学习查漏补缺

记录PR学习查漏补缺 常用快捷键文件编辑素材序列标记字幕窗口帮助 效果基本3D高斯模糊查找边缘色彩颜色平衡超级键马赛克中间值变形稳定器 常用 快捷键 注意&#xff1a;比较常用的用红色字体显示 文件 快捷键作用Ctrl Alt N新建项目Ctrl O打开项目Ctrl I导入Ctrl S保存…

链表面试题1.

1&#xff0c;反转一个单链表 采用头插法即可 class Solution {public ListNode reverseList(ListNode head) {if(head null){return head;}ListNode cur head.next;head.next null;while(cur ! null){ListNode curN cur.next;cur.next head;head cur ;cur curN;}return …

WEB攻防-PHP特性-piwigoCMS审计实例

前置知识&#xff1a;PHP函数缺陷 测试环境 &#xff1a;piwigo CMS 漏洞URL&#xff1a; 漏洞文件位置&#xff1a;\include \functions_rate.inc.php 漏洞产生入口文件&#xff1a;/picture.php picture.php中接受了一个GET方法action参数&#xff0c;作为switch...case.…

【Java探索之旅】包管理精粹 Java中包的概念与实践

文章目录 &#x1f4d1;前言一、封装1.1 封装的概念1.2 访问限定修饰符 二、封装扩展&#xff08;包&#xff09;2.1 包的概念2.2 带入包中的类2.3 自定义包2.4 常见的包 &#x1f324;️全篇总结 &#x1f4d1;前言 在Java编程中&#xff0c;封装是面向对象编程的核心概念之一…

知识产权 | 守护科技创新之光,共筑知识产权长城

2024年4月26日&#xff0c;迎来了一年一度的世界知识产权日&#xff0c;今年的主题是&#xff1a;“立足创新创造&#xff0c;构建共同未来。” 易我科技是一家专注于数据安全产品研发、生产、销售、服务一体化的高新技术软件企业。易我科技自成立以来&#xff0c;始终秉持尊重…

树莓派4B安装安卓系统LineageOS 21(Android14)

1&#xff1a;系统下载 2&#xff1a;下载好镜像后&#xff0c;准备写入SD卡&#xff0c;我这边使用的是 balenaetcher 3&#xff1a;插入树莓派&#xff0c;按照指示一步一步进行配置&#xff0c;可以配置时区&#xff0c;语言。 注意点 1》:想返回的时候按F2 2》:进入系统…

Redisson分布式锁,重试锁和锁续命的原理

RedissonLock 锁重试原理 tryLock有三个三个参数&#xff0c;第一个是等待时间&#xff0c;第二个是锁失效后自动释放的时间,不填默认为-1&#xff0c;第三个是时间单位&#xff1b; 当设置了第一个参数&#xff0c;那这个锁就成了可重试锁&#xff1b;获取锁失败后&#xff0c…

C++的演变与未来:编程艺术的持续进化

在计算机编程的演变历程中&#xff0c;C以其独特的魅力和强大的功能&#xff0c;一直占据着不可或缺的地位。从最初的面向对象编程&#xff0c;到如今的跨平台、高性能应用&#xff0c;C在不断地适应和推动着计算机技术的发展。本文将深入剖析C的演变过程&#xff0c;展望其未来…

【全国青少年信息素养大赛智能算法挑战赛初中模拟卷】

目录 模拟卷1 全国青少年信息素养大赛智能算法挑战赛初中模拟卷2 全国青少年信息素养大赛智能算法挑战赛初中模拟卷3 模拟卷1 单选题&#xff08;每题 5 分&#xff0c;共 75 分&#xff09; 1. 在C中&#xff0c;哪个关键字用于指定一个类为另一个类的基类&#xff1f; - A…