当前位置: 首页 > article >正文

springboot IOC

springboot IOC
IoC
Inversion of Control

Inversion 反转

依赖注入
DI (dependency injection )

dependency 依赖
injection 注入

Qualifier 预选赛

一文带你快速理解JavaWeb中分层解耦的思想及其实现,理解 IOC和 DI
https://zhuanlan.zhihu.com/p/15538831909

一文带你快速理解JavaWeb中分层解耦的思想及其实现,理解 IOC和 DI
上一次介绍了JavaWeb中请求响应相关的内容,这次来了解一下JavaWeb中分层解耦的思想及其实现,重点在于理解控制反转(IOC)和依赖注入(DI)。
在这里插入图片描述
一、三层架构
1、概述
1.1 controller(接收请求、响应数据)
控制层,接收前端发送的请求,对请求进行处理,并响应数据。

1.2 service(逻辑处理)
业务逻辑层,处理具体的业务逻辑。

1.3 dao(数据访问)
数据访问层(Data Access Object)(持久层),负责数据访问操作,包括数据的增、删、改、查。

在这里插入图片描述
在这里插入图片描述
1.4 对比
以前的方式与三层架构方式对比。
在这里插入图片描述
二、分层解耦
1、 基本概念
1)内聚:软件中各个功能模块内部的功能联系。

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

软件设计原则:高内聚低耦合。
2、问题导入
探讨传统的MVC模式,三层架构代码书写存在的问题。我们先看一个代码示例,再对问题进行剖析。

注:MVC模式是软件工程中常见的一种软件架构模式,该模式把软件系统(项目)分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。

1)Dao层(dao包下接口和对应实现类)

1.1)BookDao接口(com.itweb.dao.BookDao)

package com.itweb.dao;public interface BookDao {void save(); // 抽象方法
}

1.2)BookDaoImpl实现类(com.itweb.dao.impl.BookDaoImpl)

package com.itweb.dao.impl;

import com.itweb.dao.BookDao;

public class BookDaoImpl implements BookDao { // BookDao接口的实现类
@Override
public void save() { // 重写接口中的抽象方法
System.out.println(“book dao save…”);
}
}
2)Service层(service包下接口和对应实现类)

2.1)BookService接口(com.itweb.service.BookService)

package com.itweb.service;

public interface BookService {
void save();
}
2.2)BookServiceImpl实现类

package com.itweb.service.impl;

import com.itweb.dao.BookDao;
import com.itweb.dao.impl.BookDaoImpl;
import com.itweb.service.BookService;

public class BookServiceImpl implements BookService {
// 在业务层(Service层)的接口实现类中调用数据层(Dao层)的接口实现类,高耦合的根源。
private BookDao bookDao=new BookDaoImpl(); // 面向接口编程
@Override
public void save() {
bookDao.save(); // 调用BookDaoImpl实现类中的方法
}
}
3)存在问题分析
在这里插入图片描述
3.1)在业务层(Service层)的接口实现类中调用数据层(Dao层)的接口实现类时,存在较高耦合性(即数据层实现类如果修改,则在业务层中调用的实现类也要修改,导致需要重新编译、测试、部署…),究其原因,是调用的实现类导致高耦合(凡是new出来的对象的调用都存在一定的耦合性)

3.2)解决办法

思路1:将new出来的实现类去掉,直接写接口,即将 private BookDao bookDao=new BookDaoImpl(); 改为 private BookDao bookDao; 但这样也是存在问题的,对象从哪里来呢?(IOC–>解耦)

思路2:在BookServiceImpl实现类中,业务层实现依赖 dao对象运行(因为在Service层中调用了dao对象的save方法),那么这种依赖关系该如何绑定呢?(依赖注入–>绑定)

综上,由此引出了两个重要话题:IOC(控制反转)和 DI(依赖注入)
3、IOC & DI概述
3.1 控制反转(IOC)
Inversion Of Control,简称IOC。对象的创建控制权由程序自身转移到外部(容器),这种思想称为控制反转。

Spring对 IOC思想进行了实现:Spring提供了一个容器,称为IOC容器(即Spring架构中的 Core Container),用来充当IOC思想中的外部。IOC容器负责对象的创建、初始化等一系列工作,被创建或被管理的对象在IOC容器中统称为 Bean(Spring中对象都称为Bean)
3.2 依赖注入(DI)
Dependency Injection,简称DI。容器为应用程序提供运行时所依赖的资源(即在容器中建立bean与bean之间的依赖关系的整个过程)称为依赖注入。
在这里插入图片描述
3.3 Bean对象
IOC容器中创建、管理的对象,称为bean。

3.4 小结:(Spring实现充分解耦过程)
1.使用 IOC容器管理 bean对象 (IOC)
2.在IOC容器内将有依赖关系的 bean进行关系绑定 (DI)
3.最终效果
使用对象时不仅可以直接从IOC容器中获取,并且获取到的bean已经绑定了所有的依赖关系
4、IOC & DI入门程序
同样以我们问题导入那个案例作为入门程序,在原基础上做一些修改即可。具体为:

1、在对应的实现类上方添加 @Component注解实现控制反转

2、在删掉new对象的上方添加 @Autowired注解实现依赖注入
1)Dao层(dao包下接口和对应实现类)

1.1)BookDao接口(com.itweb.dao.BookDao)

package com.itweb.dao;

public interface BookDao {
void save(); // 抽象方法
}
1.2)BookDaoImpl实现类(com.itweb.dao.impl.BookDaoImpl)

package com.itweb.dao.impl;

import com.itweb.dao.BookDao;
import org.springframework.stereotype.Component;

@Component //将当前类交给IOC容器管理,成为IOC容器中的bean
public class BookDaoImpl implements BookDao { // BookDao接口的实现类
@Override
public void save() { // 重写接口中的抽象方法
System.out.println(“book dao save…”);
}
}
2)Service层(service包下接口和对应实现类)

2.1)BookService接口(com.itweb.service.BookService)

package com.itweb.service;

public interface BookService {
void save();
}
2.2)BookServiceImpl实现类

package com.itweb.service.impl;

import com.itweb.dao.BookDao;
import com.itweb.dao.impl.BookDaoImpl;
import com.itweb.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component //1.将当前类交给IOC容器管理,成为IOC容器中的bean
public class BookServiceImpl implements BookService {
// 在业务层(Service层)的接口实现类中调用数据层(Dao层)的接口实现类,高耦合的根源。
// private BookDao bookDao=new BookDaoImpl();

@Autowired // 2.运行时,IOC容器会提供该类型的bean对象,并赋值给该变量(依赖注入)
private BookDao bookDao; // 删除业务层中使用new方式创建的dao对象
@Override
public void save() {System.out.println("book service save...");bookDao.save(); // 调用BookDaoImpl实现类中的方法
}

}
5、IOC & DI详解
5.1 Bean的声明
要把某个对象交给IOC容器管理,需要在对应的类上加上如下注解之一
在这里插入图片描述
注:Controller(请求处理、响应数据),Service(逻辑处理),Dao(数据访问)

声明bean的时候,可以通过value属性指定bean的名字,如果没有指定,默认为类名首字母小写。
使用以上四个注解都可以声明bean,但是在springboot集成web开发中,声明控制器bean只能用@Controller。
5.2 Bean组件扫描
前面声明bean的四大注解,要想生效,还需要被组件扫描注解@ComponentScan扫描。

注:@ComponentScan注解虽然没有显式配置,但是实际上已经包含在了启动类声明注解@SpringBootApplication中,默认扫描的范围是启动类所在包及其子包。

@SpringBootApplication具有包扫描作用,默认扫描当前包及其子包
5.3 Bean注入
@Autowired注解,即自动装配,默认是按照类型进行,如果存在多个相同类型的bean,将会报出如下错误

在这里插入图片描述
通过以下几种方案来解决

1)@Primary

见名知意,该注解的作用即设置bean的优先级

@Primary
@Service
public class EmpServiceA implements EmpService {
}
2)@Qualifier

配合@Autowired一起使用

@RestController
public class EmpController {
@Autowired
@Qualifier(“empServiceA”)
private EmpService empService ;
3)@Resource

指定名称,按名称注入

@RestController
public class EmpController {
@Resource(name= “empServiceB”)
private EmpService empService ;
4)小结

1.依赖注入的注解

@Autowired: 默认按照类型自动装配。

如果同类型的bean存在多个:
@Primary
@Autowired +@Qualifier(“bean的名称”)
@Resource(name=“bean的名称”)
2.@Resource 与@Autowired区别(重点–面试题)

@Autowired 是spring框架提供的注解而@Resource是JDK提供的注解。
@Autowired默认是按照类型注入,而 @Resource默认是按照名称注入。

相关文章:

springboot IOC

springboot IOC IoC Inversion of Control Inversion 反转 依赖注入 DI (dependency injection ) dependency 依赖 injection 注入 Qualifier 预选赛 一文带你快速理解JavaWeb中分层解耦的思想及其实现,理解 IOC和 DI https://zhuanlan.…...

java面试每日一背 day2

1.什么是缓存击穿?怎么解决? 缓存击穿是指在高并发场景下,某个热点key突然过期失效,此时大量请求同时访问这个已经过期的key,导致所有请求都直接打到数据库上,造成数据库瞬时压力过大甚至崩溃的情况。 解…...

Ajax01-基础

一、AJAX 1.AJAX概念 使浏览器的XMLHttpRequest对象与服务器通信 浏览器网页中,使用 AJAX技术(XHR对象)发起获取省份列表数据的请求,服务器代码响应准备好的省份列表数据给前端,前端拿到数据数组以后,展…...

(37)服务器增加ipv6配置方法

(1)172.25.38.93服务器,IPv6地址如下: IPv6地址:2405:6F00:E033:B800:0000:0000:0003:0A5D IPv6掩码:/120 IPv6网关地址:2405:6F00:E033:B800:0000:0000:0003:0AFF 配置: # 静态 IPv6 地址和前缀(根据实际情况填写) IPV6ADDR=2405:6F00:E033:B800:0000:0000:0003:0…...

生成树协议(STP)配置详解:避免网络环路的最佳实践

生成树协议(STP)配置详解:避免网络环路的最佳实践 生成树协议(STP)配置详解:避免网络环路的最佳实践一、STP基本原理二、STP 配置示例(华为交换机)1. 启用生成树协议2. 配置根桥3. 查…...

面向 C 语言项目的系统化重构实战指南

摘要: 在实际开发中,C 语言项目往往随着功能演进逐渐变得混乱:目录不清、宏滥用、冗余代码、耦合高、测试少……面对这样的“技术债积累”,盲目大刀阔斧只会带来更多混乱。本文结合 C 语言的特点,从项目评估、目录规划、宏与内联、接口封装、冗余剔除、测试与 CI、迭代重构…...

网络层——蚂蚁和信鸽的关系VS路由原理和相关配置

前言(🐜✉️🕊️) 今天内容的主角是蚂蚁(动态路由)和信鸽(静态路由),为什么这么说呢,来看一则小故事吧。 森林里,森林邮局要送一份重要信件&am…...

Python Pandas库简介及常见用法

Python Pandas库简介及常见用法 一、 Pandas简介1. 简介2. 主要特点(一)强大的数据结构(二)灵活的数据操作(三)时间序列分析支持(四)与其他库的兼容性 3.应用场景(一&…...

第十六届蓝桥杯复盘

文章目录 1.数位倍数2.IPv63.变换数组4.最大数字5.小说6.01串7.甘蔗8.原料采购 省赛过去一段时间了,现在复盘下,省赛报完名后一直没准备所以没打算参赛,直到比赛前两天才决定参加,赛前两天匆匆忙忙下载安装了比赛要用的编译器ecli…...

【已解决】HBuilder X编辑器在外接显示器或者4K显示器怎么界面变的好小问题

触发方式:主要涉及DPI缩放问题,可能在电脑息屏有概率触发 修复方式: 1.先关掉软件直接更改屏幕缩放,然后打开软件,再关掉软件恢复原来的缩放,再打开软件就好了 2.(不推荐)右键HBuilder在属性里…...

直线型绝对值位移传感器:精准测量的科技利刃

在科技飞速发展的今天,精确测量成为了众多领域不可或缺的关键环节。无论是工业自动化生产线上的精细操作,还是航空航天领域中对零部件位移的严苛把控,亦或是科研实验中对微小位移变化的精准捕捉,都离不开一款高性能的测量设备——…...

解决服务器重装之后vscode Remote-SSH无法连接的问题

在你的windows命令窗口输入: ssh-keygen -R 服务器IPssh-keygen 不是内部或外部命令 .找到Git(安装目录)/usr/bin目录下的ssh-keygen.exe(如果找不到,可以在计算机全局搜索) 2.属性–>高级系统设置–>环境变量–>系统变量,找到Path变量&#…...

AI 招聘系统科普:如何辨别真智能与伪自动化

一、传统招聘模式的效率困境 在数字化转型浪潮中,传统招聘模式的效率瓶颈日益凸显。以中大型企业为例,HR 约 60% 的工作时间消耗在重复操作上: 职位发布:需在多个渠道手动登录、填写字段,单次耗时超 20 分钟&#xf…...

Ansible模块——管理100台Linux的最佳实践

使用 Ansible 管理 100 台 Linux 服务器时,推荐遵循以下 最佳实践,以提升可维护性、可扩展性和安全性。以下内容结合实战经验进行总结,适用于中大型环境(如 100 台服务器): 一、基础架构设计 1. 分组与分层…...

从0开始学习大模型--Day09--langchain初步使用实战

众所周知,一味地学习知识,所学的东西和概念都是空中楼阁,大部分情况下,实战都是很有必要的,今天就通过微调langchain来更深刻地理解它。 中间如何进入到langchain界面请参考结尾视频链接。 首先,进入界面…...

C++中的菱形继承问题

假设有一个问题,类似于鸭子这样的动物有很多种,如企鹅和鱿鱼,它们也可能会有一些共同的特性。例如,我们可以有一个叫做 AquaticBird (涉禽,水鸟的一类)的类,它又继承自 Animal 和 Sw…...

订单越来越到导致接口列表查询数据缓慢解决思路

文章目录 **一、前期诊断:定位性能瓶颈****1. 数据现状分析****2. 业务场景梳理** **二、基础优化:快速提升性能****1. 索引精准优化****2. 表结构优化(垂直分表)****3. 读写分离与缓存策略** **三、架构升级:应对千万…...

word格式相关问题

页眉 1 去除页眉横线: 双击打开页眉,然后点击正文样式,横线就没有了。 2 让两部分内容的页眉不一样: 使用“分节符”区分两部分内容,分节符可以在“布局-分隔符”找到。然后双击打开页眉,取消“链接到前一…...

网络-MOXA设备基本操作

修改本机IP和网络设备同网段,输入设备IP地址进入登录界面,交换机没有密码,路由器密码为moxa 修改设备IP地址 交换机 路由器 环网 启用Turbo Ring协议:在设备的网络管理界面中,找到环网配置选项,启用Turb…...

飞桨paddle import fluid报错【已解决】

跟着飞桨的安装指南安装了paddle之后 pip install paddlepaddle有一个验证: import paddle.fluid as fluid fluid.install check.run check()报错情况如下,但是我在pip list中,确实看到了paddle安装上了 我import paddle别的包&#xff0c…...

测试工程师要如何开展单元测试

单元测试是软件开发过程中至关重要的环节,它通过验证代码的最小可测试单元(如函数、方法或类)是否按预期工作,帮助开发团队在早期发现和修复缺陷,提升代码质量和可维护性。以下是测试工程师开展单元测试的详细步骤和方法: 一、理…...

IPv4 地址嵌入 IPv6 的前缀转换方式详解

1. 概述 在 IPv4 和 IPv6 网络共存的过渡期,NAT64(Network Address Translation 64)是一种关键技术,用于实现 IPv6-only 网络与 IPv4-only 网络的互操作。NAT64 前缀转换通过将 IPv4 地址嵌入到 IPv6 地址中,允许 IPv…...

野火鲁班猫(arrch64架构debian)从零实现用MobileFaceNet算法进行实时人脸识别(三)用yolov5-face算法实现人脸检测

环境直接使用第一篇中安装好的环境即可 先clone yolov5-face项目 git clone https://github.com/deepcam-cn/yolov5-face.git 并下载预训练权重文件yolov5n-face.pt 网盘链接: https://pan.baidu.com/s/1xsYns6cyB84aPDgXB7sNDQ 提取码: lw9j (野火官方提供&am…...

IS-IS 中间系统到中间系统

前言: 中间系统到中间系统IS-IS(Intermediate System to Intermediate System)属于内部网关协议IGP(Interior Gateway Protocol),用于自治系统内部 IS-IS也是一种链路状态协议,使用最短路径优先…...

【图像生成大模型】HunyuanVideo:大规模视频生成模型的系统性框架

HunyuanVideo:大规模视频生成模型的系统性框架 引言HunyuanVideo 项目概述核心技术1. 统一的图像和视频生成架构2. 多模态大语言模型(MLLM)文本编码器3. 3D VAE4. 提示重写(Prompt Rewrite) 项目运行方式与执行步骤1. …...

GitHub 趋势日报 (2025年05月19日)

本日报由 TrendForge 系统生成 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日整体趋势 Top 10 排名项目名称项目描述今日获星总星数语言1public-apis/public-apis免费API的集体清单⭐ 1821⭐ 344364Python2virattt/a…...

如何使用Java生成pdf报告

文章目录 一、环境准备与Maven依赖说明二、核心代码解析1. 基础文档创建2. 中文字体处理3. 复杂表格创建4. 图片插入 三、完整代码示例四、最终效果 这篇主要说一下如何使用Java生成pdf,包括标题,文字,图片,表格的插入和调整等相关…...

HarmonyOS鸿蒙应用规格开发指南

在鸿蒙生态系统中,应用规格是确保应用符合系统要求的基础。本文将深入探讨鸿蒙应用的规格开发实践,帮助开发者打造符合规范的应用。 应用包结构规范 1. 基本配置要求 包结构规范 符合规范的应用包结构正确的HAP配置文件完整的应用信息 示例配置&…...

【Harmony】【鸿蒙】List列表View如何刷新内部的自定义View的某一个控件

创建自定义View Component export struct TestView{State leftIcon?:Resource $r(app.media.leftIcon)State leftText?:Resource | string $r(app.string.leftText)State rightText?:Resource | string $r(app.string.rightText)State rightIcon?:Resource $r(app.med…...

iisARR负均衡

IIS ARR负载均衡详细配置指南 🎯 什么是ARR(Application Request Routing) ARR是IIS的一个扩展模块,它可以: 负载均衡:将请求分发到多个服务器反向代理:隐藏后端服务器架构健康检查&#xf…...