Spring的核心思想

news/2024/9/19 0:44:08/ 标签: spring, java, 后端

目录

一、Spring要解决的问题

spring%E7%9A%84%E6%A0%B8%E5%BF%83%E7%BB%93%E6%9E%84-toc" style="margin-left:0px;">二、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%E7%9A%84%E6%A0%B8%E5%BF%83%E7%BB%93%E6%9E%84">二、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 为什么叫做面向切面编程


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


http://www.ppmy.cn/news/1525727.html

相关文章

『功能项目』战士的位移型技能【46】

我们打开上一篇45战士的伤害型技能的项目, 本章要做的事情是制作技能按钮,点鼠标点击时释放如果20米内存在敌人会移动到敌人身边(对多个敌人逻辑暂未写)并对怪物造成一定伤害 首先对战士职业的动画控制器增加一个新的技能2动画 设…

JavaWeb【day14】--(SpingBoot原理)

SpingBoot原理 在前面十多天的课程当中,我们学习的都是web开发的技术使用,都是面向应用层面的,我们学会了怎么样去用。而我们今天所要学习的是web后端开发的最后一个篇章springboot原理篇,主要偏向于底层原理。 我们今天的课程安…

2023年408真题计算机网络篇

https://zhuanlan.zhihu.com/p/6954228062023年网络规划设计师上午真题解析TCP流量计算_哔哩哔哩_bilibili 1 1在下图所示的分组交换网络中,主机H1和H2通过路由器互联,2段链路的数据传输速率为100 Mb/s、时延带宽积 (即单向传播时延带宽&am…

文件外发怎么保证安全

为了确保文件在外发过程中的安全,金刚钻信息网站的防泄密系统支持以下多种措施来防止数据泄露和未经授权的访问: 1. 文件加密 加密文件:在文件外发前对其进行加密处理,确保只有持有解密密钥或密码的人才能访问文件内容。加密工具…

大数据时代下会计数字化的思考与建议

引言 随着信息技术的飞速发展,大数据已成为推动社会进步和经济发展的新引擎。会计行业作为经济活动的重要组成部分,其数字化转型已成为必然趋势。本文旨在探讨大数据时代下会计数字化的现状、挑战以及未来的发展方向,并提出相应的思考与建议。…

在WPF中使用矢量图标

使用SVG/Path WPF支持绘图,在WPF中定义了一些基本图形,如Line、Rectangle、Ellipse、Path等 其中Path支持使用路径来进行绘图,所以大部分的图标可以通过Path来进行绘制。 因为本文主要是介绍矢量图标,所以不对绘图进行详细介绍…

目标检测-小目标检测方法

小目标检测是计算机视觉中的一个挑战性问题,因为小目标往往在图像中占据的像素较少,容易被背景或其他物体干扰。为了有效地进行小目标检测,研究人员和工程师提出了多种方法和算法来提高检测精度。以下是一些针对小目标检测的有效方式和算法&a…

[Golang] Channel

[Golang] Channel 文章目录 [Golang] Channel什么是Channelchannel的初始化channel的操作双向channel和单向channel为什么有channel有缓冲channel和无缓冲channlechannel做一把锁 从之前我们知道go关键字可以开启一个Goroutine,但是Goroutine之间的通信还需要另一个…

ros2中使用launch.xml启动时,怎么在命令行里设置参数,或者加载参数文件(params.yaml)

在ROS2中使用launch.xml启动时,可以通过命令行设置参数或加载参数文件(如params.yaml)。以下是具体的方法: 1. 在命令行中设置参数 你可以在运行ros2 launch命令时直接设置参数,使用key:value的语法。例如&#xff1…

SSL/TLS

SSL/TLS 握手的全部步骤 客户端 Hello(Client Hello) 客户端向服务器发送 Client Hello 消息,包含以下信息: 支持的 SSL/TLS 版本(例如 TLS 1.2 或 TLS 1.3)支持的加密套件(cipher suites&#…

golang学习笔记22——golang微服务中数据竞争问题及解决方案

推荐学习文档 golang应用级os框架,欢迎star基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总golang学习笔记01——基本数据类型golang学习笔记02——gin框架及基本原理golang学习笔记03——gin框架的核心数据结构golang学…

Java学习Day41:骑龙救!(springMVC)

springMVC与sevlet都是对应表现层web的,但是越复杂的项目使用SpringMVC越方便 基于Java实现MVC模型的轻量级web框架 目标: 小案例: 1.导入依赖 spring-context: 提供 Spring 框架的核心功能,如依赖注入、事件发布和其他应用上…

Linux环境基础开发工具---vim

1.快速的介绍一下vim vim是一款多模式的编辑器,里面有很多子命令,来实现代码编写操作。 2.vim的模式 vim一共有三种模式:底行模式,命令模式,插入模式。 2.1vim模式之间的切换 2.2 谈论常见的模式---命令模式&#xf…

为什么H.266未能普及?EasyCVR视频编码技术如何填补市场空白

H.266,也被称为Versatile Video Coding(VVC),是近年来由MPEG(Moving Picture Experts Group)和ITU(International Telecommunication Union)联合开发并发布的新一代国际视频编码标准…

【云原生安全篇】一文掌握Harbor集成Trivy应用实践

【云原生安全篇】一文掌握Harbor集成Trivy应用实践 目录 1 概念 1.1 什么是 Harbor 和 Trivy? 1.1.1 Harbor 1.1.2 Trivy 1.2 Harbor 与 Trivy 的关系 Trivy 在 Harbor 中的作用: 1.3 镜像扫描工作流程 2 实战案例:在Harbor 配置 Trivy …

Android 签名、空包签名 、jarsigner、apksigner

jarsigner是JDK提供的针对jar包签名的通用工具, 位于JDK/bin/jarsigner.exe apksigner是Google官方提供的针对Android apk签名及验证的专用工具, 位于Android SDK/build-tools/SDK版本/apksigner.bat jarsigner: jarsigner签名空包执行的命令: jar…

【系统架构师】-论文-2024-2009年系统架构师历年论文题目

2024年5月 大数据Lambda架构的应用与分析 云原生云上DevOps运维应用与分析 模型驱动软件开发方法与应用 论单元测试在软件回归测试中的应用和分析 2023年 论面向对象设计的应用与实现 论多数据源集成的应用与实现 论软件可靠性模型的设计与实现 论边缘计算技术的设计与实现 …

openssh移植:精致的脚本版

前置文章: busybox移植:全能脚本版-CSDN博客 zlib交叉编译-CSDN博客 openssl移植:精致的脚本版-CSDN博客 源码下载 官网:http://www.openssh.com/ 下载了一个很新的版本 ftp://mirrors.sonic.net/pub/OpenBSD/OpenSSH/portable/openss…

android API、SDK与android版本

随着 Android 系统的不断更新,API Level 也会随之增加。每个新的 API Level 都引入了新的功能、改进旧的功能,或者弃用了旧的 API。开发者在开发应用时,需要指定目标 API Level,也就是应用最低支持的 Android 版本。 API Level 与…

C++速通LeetCode简单第9题-二叉树的最大深度

深度优先算法递归: /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right…