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的像素点数显示: 也…

力扣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 终端输…

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…

【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;展望其未来…

C++ 优先级队列priority_queue

1、常用接口 底层使用的是堆实现&#xff0c;默认为大堆 2、理解&#xff1a; 优先级队列就是即使插入的是一个乱序的&#xff0c;但是依旧会按照有序的顺序出队列 优先级队列就是会根据大小来出队列&#xff0c;而不是谁在队头就出谁。 优先级队列底层是使用堆实现&#x…

Java项目:基于SSM框架实现的实践项目管理系统(ssm+B/S架构+源码+数据库+毕业论文+开题报告)

一、项目简介 本项目是一套基于SSM框架实现的实践项目管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff…

【前端】-【防止接口重复请求】

文章目录 需求实现方案方案一方案二方案三 需求 对整个的项目都做一下接口防止重复请求的处理 实现方案 方案一 思路&#xff1a;通过使用axios拦截器&#xff0c;在请求拦截器中开启全屏Loading&#xff0c;然后在响应拦截器中将Loading关闭。 代码&#xff1a; 问题&…

Coursera: An Introduction to American Law 学习笔记 Week 04: Constitutional Law

An Introduction to American Law 本文是 https://www.coursera.org/programs/career-training-for-nevadans-k7yhc/learn/american-law 这门课的学习笔记。 文章目录 An Introduction to American LawInstructors Week 04: Constitutional LawKey Constitutional Law TermsSup…

黑马 - websocket搭建在线聊天室

这里写自定义目录标题 一、消息推送常见方式二、websocket 是什么&#xff1f;三、websocket api的介绍1、客户端 &#xff08;浏览器&#xff09; 四、实现在线聊天室1、需求2、聊天室流程分析3、消息格式4、代码实现 一、消息推送常见方式 1、轮训方式 2、SSE&#xff08;…

2024年第二十一届 五一杯 (A题)大学生数学建模挑战赛 | 多目标优化问题,深度学习分析 | 数学建模完整代码解析

DeepVisionary 每日深度学习前沿科技推送&顶会论文&数学建模与科技信息前沿资讯分享&#xff0c;与你一起了解前沿科技知识&#xff01; 本次DeepVisionary带来的是五一杯的详细解读&#xff1a; 完整内容可以在文章末尾全文免费领取&阅读&#xff01; 第一个问题…