Spring的核心思想

目录

一、Spring要解决的问题

二、Spring的核心结构

三、核心思想

3.1.1 什么是IOC

3.1.2 IOC解决的问题:耦合

3.1.3 IOC和DI的区别

3.2.1 什么是AOP

3.2.2 AOP解决的问题:耦合

3.2.3 为什么叫做面向切面编程


一、Spring要解决的问题


问题1:系统的类与类之间的依赖性,导致改一个类,可能相关的引用类都得改,牵一发而动全身。
解决方法:解耦,让bean的全生命周期管理(bean的定义、bean的初始化、bean的增强)由spring进行控制

问题2:很多复杂的功能比如事务、http请求等,用命令式编程,了解实现细节,会有比较大的复杂度
解决方法:简化,spring将一些复杂功能实现,使用者不需要关注实现细节,直接通过声明式编程(注解+配置)使用,大大降低了复杂度

比如:
http请求的解析-->http请求框架
字符串的增删改-->stringutil字符串编辑框架
对象之间的关联和创建和对象生命周期的管理-->IOC框架

二、Spring的核心结构

三、核心思想

3.1.1 什么是IOC


IoC:Inversion of Control (控制反转/反转控制),是一个技术思想,将对象创建(实例化、管理)的控制权交给外部环境(spring框架、ioc容器)

描述的事情:Java开发领域对象的创建(实例化)、管理的问题

举例:
传统开发方式:比如类A依赖于类B,往往会在类A中new一个B的对象

IoC思想下开发方式:我们不用自己去new对象了,而是由IoC容器(Spring框架)去帮助我们实例化对象并且管理它,我们需要使用哪个对象,去问IoC容器要即可

3.1.2 IOC解决的问题:耦合


比如:service层调用dao层时,只需要调用接口userService,而不需要知道具体的实现类userServiceImpl

3.1.3 IOC和DI的区别


DI:Dependancy Injection(依赖注入)

IOC和DI描述的是同一个事情,只不过角度不同
IOC是站在对象的角度,对象实例化及其管理的权利交给了(反转)容器
DI是站在容器的角度,容器会把对象依赖的其他对象注入(送进去)

3.2.1 什么是AOP


AOP: Aspect oriented Programming 面向切面编程/面向方面编程

AOP是OOP的延续,OOP三大特征:封装、继承和多态,OOP是一种垂直继承体系

OOP编程思想可以解决大多数的代码重复问题,但是有些情况是处理不了的,比如在类的多个方法中相同位置出现了重复代码,比如计算每个方法用了多长时间来进行性能监控,方法开头一个查询当前时间调用,方法结尾一个查询当前时间调用并计算时间差。

横切逻辑代码

横切代码逻辑的问题:
· 横切代码重复问题
· 横切逻辑代码和业务代码混杂在一起,代码臃肿,维护不方便

AOP提出了横向抽取机制,将横切逻辑代码和业务逻辑代码拆分,在不改变原有业务逻辑的情况下,悄无声息的把横切逻辑代码应用到原有的业务逻辑中,达到和原来一样的效果

3.2.2 AOP解决的问题:耦合


在不改变原有业务逻辑情况下,增强横切逻辑代码,根本上解耦合,避免横切逻辑代码重复

3.2.3 为什么叫做面向切面编程


「切」:指的是横切逻辑,原有业务逻辑代码我们不能动,只能操作横切逻辑代码,所以面向横切逻辑
「面」:横切逻辑代码往往要影响的是很多个方法,每一个方法都如同一个点,多个点构成面,有一个面的概念在里面

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

maya-vray渲染蒙版

要用一个叫vrayMulWrapper的材质球,把alpha Conterbution调到-1,勾选matte surface启用蒙版物体。

爬虫逆向学习(六):补环境过某数四代

声明:本篇文章内容是整理并分享在学习网上各位大佬的优秀知识后的实战与踩坑记录 引用博客: https://blog.csdn.net/shayuchaor/article/details/103629294 https://blog.csdn.net/qq_36291294/article/details/128600583 https://blog.csdn.net/weixin_…

时序预测 | Matlab实现GA-CNN遗传算法优化卷积神经网络时间序列预测

时序预测 | Matlab实现GA-CNN遗传算法优化卷积神经网络时间序列预测 目录 时序预测 | Matlab实现GA-CNN遗传算法优化卷积神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 时序预测 | Matlab实现GA-CNN遗传算法优化卷积神经网络时间序列预测&#xff…

巴西电商市场规模、前景及支付方式(pix、Boleto)

一、巴西电商市场分析 作为拉丁美洲最大经济体,巴西在拉丁美洲经济中占据领先地位,根据巴西地理与统计研究所(IBGE)的数据,2023年巴西GDP达到2.2万亿美元,跃居世界第九大经济体。数字化进程以及经济多元化推进正在推动该国中产阶…

TiDB 数据库核心原理与架构_Lesson 01 TiDB 数据库架构概述课程整理

作者: 尚雷5580 原文来源: https://tidb.net/blog/beeb9eaf 注:本文基于 TiDB 官网 董菲老师 《TiDB 数据库核心原理与架构(101) 》系列教程之 《Lesson 01 TiDB 数据库架构概述》内容进行整理和补充。 课程链接:…

PowerBI 关于FILTERS函数和VALUES函数

本人是powerbi新手,最近在使用Filters()函数和Values()函数时,有点不太明白它们之间的区别,u有时它们得到的结果是一样的,有时却不一样。 官方文档里,Filters()是表示返回直接作为筛选器应用到 columnName 的值 FILT…

凸优化学习(1)——什么是凸优化、凸集、凸函数

🍅 写在前面 👨‍🎓 博主介绍:大家好,这里是hyk写算法了吗,一枚致力于学习算法和人工智能领域的小菜鸟。 🔎个人主页:主页链接(欢迎各位大佬光临指导) ⭐️近…

Python之NumPy超详细学习指南:从入门到精通(上篇)

文章目录 Python NumPy学习指南:从入门到精通第一部分:NumPy简介与安装1. 什么是NumPy?2. 安装NumPy使用pip安装:使用Anaconda安装: 第二部分:NumPy数组基础1. NumPy数组的创建从列表创建一维数组&#xff…

OpenCV结构分析与形状描述符(14)拟合直线函数fitLine()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 拟合一条直线到2D或3D点集。 fitLine 函数通过最小化 ∑ i ρ ( r i ) \sum_i \rho(r_i) ∑i​ρ(ri​)来拟合一条直线到2D或3D点集&#xff0c…

FishAudio发布了 Fish Speech V1.4

还记得今年OpenAI 刚推出 gpt4o 不久,开源界就出现了 ChatTTS 和 FishSpeech 这些不错的 TTS 项目。 而 Fish Speech V1.4 是一个领先的文本到语音(TTS)模型,它是在 700,000 小时的多语言音频数据基础上训练出来的。 该模型支持八…

K8s 之Pod的定义及详细资源调用案例

资源管理介绍 在kubernetes中,所有的内容都抽象为资源,用户需要通过操作资源来管理kubernetes。kubernetes的本质上就是一个集群系统,用户可以在集群中部署各种服务所谓的部署服务,其实就是在kubernetes集群中运行一个个的容器&a…

[XILINX] 正点原子ZYNQ7015开发板!ZYNQ 7000系列、双核ARM、PCIe2.0、SFPX2,性能强悍,资料丰富!

正点原子ZYNQ7015开发板!ZYNQ 7000系列、双核ARM、PCIe2.0、SFPX2,性能强悍,资料丰富! 正点原子Z15 ZYNQ开发板,搭载Xilinx Zynq7000系列芯片,核心板主控芯片的型号是XC7Z015CLG485-2。开发板由核心板&…

GLSL 棋盘shader

今日永杰开金 float size 100.;vec2 checkerboard mod(floor(gl_FragCoord.xy / size), 2.);float c mod(checkerboard.x checkerboard.y, 2.);gl_FragColor vec4(vec3(c), 1);或 vec2 uv floor(S * p.xy * vec2(iResolution.x / iResolution.y, 1) / iResolution.xy); …

【主机入侵检测】Wazuh规则详解

前言 Wazuh 规则是一组用XML格式编写的条件,它们定义了应该如何解释日志数据。这些规则由Wazuh Manager使用,用于在日志消息中检测特定的模式或行为,并相应地生成警报或响应。它们在威胁检测中扮演着至关重要的角色,因为它们允许系…

Golang | Leetcode Golang题解之第397题整数替换

题目: 题解: func integerReplacement(n int) (ans int) {for n ! 1 {switch {case n%2 0:ansn / 2case n%4 1:ans 2n / 2case n 3:ans 2n 1default:ans 2n n/2 1}}return }

k8s(kubernetes)的PV / PVC / StorageClass(理论+实践)

NFS总是不支持PVC扩容 先来个一句话总结:PV、PVC是K8S用来做存储管理的资源对象,它们让存储资源的使用变得可控,从而保障系统的稳定性、可靠性。StorageClass则是为了减少人工的工作量而去自动化创建PV的组件。所有Pod使用存储只有一个原则&…

uniapp child.onFieldChange is not a function

uni-forms // 所有子组件参与校验,使用 for 可以使用 awiatfor (let i in childrens) {const child childrens[i];let name realName(child.name);if (typeof child.onFieldChange function) {const result await child.onFieldChange(tempFormData[name]);if (result) {…

SpringBoot 处理 @KafkaListener 消息

消息监听容器 1、KafkaMessageListenerContainer 由spring提供用于监听以及拉取消息,并将这些消息按指定格式转换后交给由KafkaListener注解的方法处理,相当于一个消费者; 看看其整体代码结构: 可以发现其入口方法为doStart(),…

前端用html写excel文件直接打开

源码 <html xmlns:o"urn:schemas-microsoft-com:office:office" xmlns:x"urn:schemas-microsoft-com:office:excel" xmlns"http://www.w3.org/TR/REC-html40"> <head><meta charset"UTF-8"><!--[if gte mso 9]&…

C++学习笔记之引用(基础)

C学习笔记之引用 https://www.runoob.com/cplusplus/cpp-references.html 引用变量是一个别名&#xff0c;它是已存在变量的另一个名字 一旦把引用初始化为某个变量&#xff0c;可以使用该引用名称或变量名称来指向变量 1、引用vs指针 引用和指针之间有一些相似&#xff0c;也…