springboot IOC

news2025/5/23 19:28:39

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默认是按照名称注入。

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

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

相关文章

Ajax01-基础

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

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

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

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

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

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在属性里…

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

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

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

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

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

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

C++中的菱形继承问题

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

网络-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…

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

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

如何使用Java生成pdf报告

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

人脸识别备案开启安全防护模式!紧跟《办法》!

国家互联网信息办公室与公安部于 2025 年 3 月 13 日联合公布了《人脸识别技术应用安全管理办法》(以下简称《办法》),并自 2025 年 6 月 1 日起正式施行。其中,人脸识别备案成为了规范技术应用、守护信息安全的关键一环。​ 一、…

新浪《经济新闻》丨珈和科技联合蒲江政府打造“数字茶园+智能工厂+文旅综合体“创新模式

5月14日,新浪网《经济新闻》频道专题报道珈和科技在第十四届四川国际茶业博览会上的精彩亮相,并深度聚焦我司以数字技术赋能川茶产业高质量发展创新技术路径,及在成都市“茶业建圈强链”主题推介会上,珈和科技与蒲江县人民政府就智…

50、js 中var { ipcRenderer } = require(‘electron‘);是什么意思?

在 JavaScript 中,var { ipcRenderer } require(‘electron’); 这行代码的含义是: 1. require(‘electron’) 这是 Node.js 的模块引入语法,用于加载 Electron 的核心模块。electron 是 Electron 框架的主模块,提供了构建桌面…