spring学习(spring的IoC思想、spring容器、spring配置文件、依赖注入(DI)、BeanProxy机制(AOP))
目录
一、spring-IoC。
(1)spring框架。(诞生原因及核心思想)
1、为什么叫框架?
2、spring框架诞生的技术背景。
(2)控制反转(IoC)。
(3)spring的Bean工厂和IoC容器。
(4)spring配置文件(springConfig.xml)。
1、XML文档的标准声明。
2、最外层标签属性声明。
3、内层的多个标签。
4、Controller层与Service层之间的"解耦"。
ApplicationContext(IoC容器)。
BeanFactory。(Bean工厂)
二、spring-DI。(依赖注入)
(1)DI的基本概念。
(2)Setter方式注入(手动注入)。
三、spring-AOP。(面向切面编程)
(1)AOP的基本概念。
(2)图解。
四、spring框架核心思想总结。
(1)图解说明。
- Spring Framework的核心思想主要包括三个方面:控制反转(IoC)、依赖注入(DI)和面向切面编程(AOP)
一、spring-IoC。
(1)spring框架。(诞生原因及核心思想)
1、为什么叫框架?
- 框架它是一种结构体。它具备通用性,且能达到快速实现产品的功能。
2、spring框架诞生的技术背景。
- 主要是出现在很多年前Web开发过程中遇到的重大问题。当基于三层模型开发时,在业务逻辑的代码中能看到很多的手动new对象的代码,这样会造成高度耦合。
- 基于上述"高耦合"问题。spring框架向我们提供了一个生产与管理对象的工厂(BeanFactory)。这样就不需要自己手动的new对象,而是将对象的管理交给spring(第三方)Bean工厂的容器。包括对象的实例化、对象间的依赖关系都由spring处理。
(2)控制反转(IoC)。
- 控制反转(Inversion of Control,IoC)是一种设计原则。其使用是用于降低代码之间的耦合度。
- 在传统的程序开发中,组件(对象)之间的依赖关系通常由程序内部进行管理,这会导致代码之间的紧密耦合,难以维护和扩展。
- 而spring框架中的IoC的思想就是将组件(对象)间的关系从程序内部转移到外部容器中进行管理。
- 通常通过XML文件或注解的方式来实现。这种方式使得组件之间的依赖关系更加灵活,易于管理和扩展。
(3)spring的Bean工厂和IoC容器。
- 上面提到的“外部容器”,就是spring提供管理bean对象的spring容器。
spring容器是spring框架的核心。
spring容器的工作:进行实例化对象,把它们连接在一起,配置它们,并管理他们的整个生命周期从创建到销毁。
spring容器使用依赖注入(DI)来管理组成一个应用程序的组件。
- spring-IoC 容器利用Java的 POJO(实体)类和配置元数据来生成完全配置和可执行的系统或应用程序。
IoC容器具有依赖注入功能的容器,它可以创建对象,IoC容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。通常new一个实例,控制权由程序员控制!而"控制反转"是指new实例工作不由程序员来做而是交给spring容器来做。
未使用与使用IoC容器管理对象的图解。(注:该图请勿直接复制进行商用!版权问题必究)
spring提供了两种容器供我们使用。
查阅继承树,可以发现ApplicationContext容器的底层是继承至BeanFactory。因为ApplicationContext是IOC容器的更高级实现,它继承了BeanFactory的所有功能。
两种spring容器的具体使用方法在下面简单展示。使用spring容器管理bean对象涉及到spring配置文件的使用!所以请继续往下看。
(4)spring配置文件(springConfig.xml)。
- 如果未学过DI(依赖注入),建议先跳过这一部分内容。当看完下方的DI(依赖注入)再往回看,因为下面内容包含一个简单的使用spring-Ioc、spring-DI思想的程序。
- 用于定义和管理应用程序中的Bean(对象)。如下有一个的springConfig.xml文件。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!--配置生产UserService对象--><bean id="userService" class="com.fs.service.UserService"></bean><!--配置生产UserController对象--><bean id="userController" class="com.fs.controller.UserController"><!--配置属性值--><property name="userService" ref="userService"></property></bean> </beans>
1、XML文档的标准声明。
- 该配置文件的第一行指定了XML版本和编码。
2、最外层标签<beans>属性声明。
定义了默认的命名空间(namespace),用于Bean的定义。
定义了XSI命名空间,用于XML Schema实例的声明。
定义xxxLocation,指明了XML Schema的位置,用于验证XML文件是否符合Spring的Bean定义规范。
3、内层的多个<bean>标签。
- 主要功能:配置应用程序中的Bean(对象)以及依赖注入的完成。
- <bean id="userService" class="com.fs.service.UserService">:定义了一个Bean,其ID为“userService”,类的引用为“com.fs.service.UserService”。这个Bean通常是处理业务逻辑的。将由Spring容器管理,并且可以被其他Bean("UserController")引用(依赖)。
- <bean id="userController" class="com.fs.controller.UserController">:定义了另一个Bean,其ID为“userController”,类的引用为“com.fs.controller.UserController”。这个Bean通常是一个控制器,用于处理用户请求。
- <property name="userService ref="userService">:在UserController的Bean中,通过<property>标签注入了对UserService的Bean的引用。
- 这里的name属性指定了UserController类中需要注入的属性名称,而ref属性指定了要注入的Bean的ID(在<bean>标签已定义的userServiceBean)。
- 这种注入方式称为按引用注入(setter注入),因为Spring会调用UserController中提供的setter()方法来设置其userService属性。
4、Controller层与Service层之间的"解耦"。
ApplicationContext(IoC容器)。
- UserController类代码如下。
- 将"UserService类对象设置成成员属性,通过spring的工厂(依赖注入)拿取到对象,而不是通过手动new获取对象。
- 如下的main方法是通过spring提供的类"ApplicationContext"(IoC容器)的实现类完成Ioc与DI(依赖注入)。
- 在实例化类"ClassPathXmlApplicationContext"的对象时,记得传入参数(spring的配置文件名。如:springConfig.xml)
- 因为ApplicationContext是IOC容器的更高级实现,它继承了BeanFactory的所有功能。所以最后也是通过spring的BeanFactory提供的getBean()方法拿到对应类的对象。
- 总结:通过spring管理程序中的Bean对象与它们之间的关系。(容器:ApplicationContext容器(IoC容器))
package com.fs.controller;import com.fs.service.UserService; import org.springframework.context.support.ClassPathXmlApplicationContext; // UserController类 public class UserController {//通过依赖注入拿取UserService对象UserService userService;public void setUserService(UserService userService) {this.userService = userService;}//UserController类的print方法public void print(){System.out.println("UserController的print方法");userService.print();}public static void main(String[] args) {//创建容器ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("springConfig.xml");//通过spring工厂获取指定bean对象UserController userController = app.getBean("userController", UserController.class);/*UserController userController = new UserController(); 取消这种手动new对象的操作*/userController.print();} }
- userService类代码如下。
package com.fs.service; // UserService类 public class UserService {//UserService类的print方法public void print(){System.out.println("UserService的print方法");} }
- 运行测试1如下。
BeanFactory。(Bean工厂)
- 如下的测试类的main方法是通过spring提供的BeanFactory(IoC容器)的实现类完成Ioc与DI(依赖注入)。
- 首先使用BeanFactory工厂类的实现类"DefaultListableBeanFactory"获得bean工厂的对象。
- 再通过new(创建)解析(读取)bean配置文件的类"XmlBeanDefinitionReader"对象,实例化对象的同时并传入之前创建的工厂对象。
- 再通过方法“loadBeanDefinitions("填写配置文件名。如springConfig.xml")”加载spring的配置文件。
- 最后通过spring的BeanFactory提供的getBean()方法拿到对应类的对象。
- 总结:通过spring管理程序中的Bean对象与它们之间的关系。(容器:BeanFactory)
package com.fs;import com.fs.controller.UserController; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;public class MainApp {public static void main(String[] args) {/*创建容器(该方法是通过ApplicationContext容器实例化对象)ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("springConfig.xml");*///使用BeanFactory工厂实现IoC、DI(依赖注入与控制反转)BeanFactory beanFactory = new DefaultListableBeanFactory();//使用DefaultListableBeanFactory(BeanFactory的实现类)DefaultListableBeanFactory defaultListableBeanFactory = new DefaultListableBeanFactory();//加载配置清单(文件)XmlBeanDefinitionReader xmlBeanDefinitionReader = new XmlBeanDefinitionReader(defaultListableBeanFactory);xmlBeanDefinitionReader.loadBeanDefinitions("springConfig.xml");Object obj = defaultListableBeanFactory.getBean("userController");UserController userController = (UserController) obj;userController.print();} }
- 运行测试2如下。
二、spring-DI。(依赖注入)
(1)DI的基本概念。
- 依赖注入(Dependency Injection,DI)是实现spring-IoC的一种技术。
- 在spring中,依赖注入可以通过构造器、Setter方法或字段注入等方式进行。
- 通过依赖注入,组件之间的依赖关系由外部容器动态注入,而不是在代码中硬编码,从而降低了组件之间的耦合度,提高了代码的可测试性和可维护性。
- 注意:因为博主还未学完!所以这里只是简单依赖注入方式(Setter方式注入)演示。除了spring配置文件、还需手动提供setXX()方法完成操作。
(2)Setter方式注入(手动注入)。
- controller层、service层对象交给spring的BeanFactory的容器进行管理。(使用spring的配置文件)
- 通过依赖注入技术实现IoC思想。完成bean对象的实例化以及对象间的依赖关系管理。
三、spring-AOP。(面向切面编程)
(1)AOP的基本概念。
- 面向切面编程(Aspect-Oriented Programming,AOP)是一种编程范式。"编程范式"它指的是一种编程风格或者编程方法论,是程序员用来编写程序的框架和方法。
- “面向切面编程”它提供了一种新的方法来分离横切关注点,比如日志记录、事务管理、安全性等,这些关注点通常横跨多个模块或组件。它允许开发者将横切关注点(如日志、事务管理等)模块化,并把它们应用到多个类中。
AOP通过“切面”(aspect)和“连接点”(join point)等概念来实现这种分离,允许开发者在不修改业务逻辑代码的情况下,增加额外的功能。这种方式使得代码更加清晰,维护更加方便。
(2)图解。
- 在面向切面编程(AOP)中,"增强bean"通常指的是在不修改原有代码(即不增加冗余代码)的情况下,通过AOP技术为现有的bean(即Spring框架中的单例对象)添加额外的功能或行为。(日志记录、事务管理、安全性检验等)
四、spring框架核心思想总结。
(1)图解说明。
- 该图仅供学习,请勿直接商用,否则版权必究!
- 主要是3种核心思想:IoC(控制反转)思想、DI(依赖注入)思想、AOP(面向切面编程)思想。
相关文章:

spring学习(spring的IoC思想、spring容器、spring配置文件、依赖注入(DI)、BeanProxy机制(AOP))
目录 一、spring-IoC。 (1)spring框架。(诞生原因及核心思想) 1、为什么叫框架? 2、spring框架诞生的技术背景。 (2)控制反转(IoC)。 (3)spring的Bean工厂和IoC容器。 &a…...

谁说C比C++快?
看到这个问题,我我得说:这事儿没有那么简单。 1. 先把最大的误区打破 "C永远比C快" —— 某位1990年代的程序员 这种说法就像"自行车永远比汽车省油"一样荒谬。我们来看个例子: // C风格 char* str (char*)malloc(100…...

GEE+本地XGboot分类
GEE本地XGboot分类 我想做提取耕地提取,想到了一篇董金玮老师的一篇论文,这个论文是先提取的耕地,再做作物分类,耕地的提取代码是开源的。 但这个代码直接在云端上进行分类,GEE会爆内存,因此我准备把数据下…...

OpenCV相机标定与3D重建(24)计算两个二维点集之间的最佳仿射变换矩阵(2x3)函数estimateAffine2D()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 计算两个二维点集之间的最优仿射变换,它计算 [ x y ] [ a 11 a 12 a 21 a 22 ] [ X Y ] [ b 1 b 2 ] \begin{bmatrix} x\\ y\\ \en…...

UIP协议栈 TCP通信客户端 服务端,UDP单播 广播通信 example
文章目录 1. TCP通信 客户端(关键配置)2. TCP 服务端配置3. UDP 点播通信4. UDP 广播通信5. UIP_UDP_APPCALL 里边的处理example6. TCP数据处理 ,UIP_APPCALL调用的函数 UIP_APPCALL TCP的数据都在这个宏定义的函数里进行数据处理的 UDP 数据…...

【NoSQL系列】为什么要使用Redis?
第一次知道Redis是以前准备面试的时候,只知道是用来缓存数据的。随着这几年的工作,对软件的认识从盲人摸象到睁眼看世界。 在常用的软件架构评价模型中,性能、可用性、安全性和可维护性是常见的评价属性,客户总希望系统响应又快有…...

MySQL Explain 分析SQL语句性能
一、EXPLAIN简介 使用EXPLAIN关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是表结构的性能瓶颈。 (1) 通过EXPLAIN,我们可以分析出以下结果: 表的读取顺序数据读取…...

IIS部署程序https是访问出现403或ERR_HTTP2_PROTOCOL_ERROR
一、说明 在windows server 2016中的IIS程序池里部署一套系统,通过https访问站点,同时考虑到安全问题以及防攻击等行为,就用上了WAF云盾功能,能有效的抵挡部分攻击,加强网站的安全性和健壮性。 应用系统一直能够正常…...

学技术学英文:代码中的锁:悲观锁和乐观锁
本文导读: 1. 举例说明加锁的场景: 多线程并发情况下有资源竞争的时候,如果不加锁,会出现数据错误,举例说明: 业务需求:账户余额>取款金额,才能取钱。 时间线 两人共有账户 …...

青少年编程与数学 02-004 Go语言Web编程 02课题、依赖管理
青少年编程与数学 02-004 Go语言Web编程 02课题、依赖管理 课题摘要:一、项目结构各目录说明: 二、依赖项三、依赖管理任务四、依赖管理步骤1. 初始化Go Modules项目2. 添加依赖3. 指定依赖版本4. 更新依赖5. 清理未使用的依赖6. 离线工作7. 模块隔离8. 可重现构建 …...

MyBatis写法汇总
Mybatis写法汇总 1. 批量操作 1.1 批量插入 <insert id"batchInsert" parameterType"java.util.List">INSERT INTO user (username, password, create_time) VALUES<foreach collection"list" item"item" separator"…...

【Linux学习】十五、Linux/CentOS 7 用户和组管理
文章目录 一、组的管理1.组的创建格式:参数: 2.组的删除格式:参数: 3.组的属性修改格式:参数: 4.查看组的信息①cat /etc/group 命令②getent group 命令③仅显示系统中所有组名 二、用户的管理①超级用户&…...
三维无人机航迹算法的目标函数如何确定
一、定义目标函数 在三维无人机航迹算法中,目标函数的确定通常基于具体的任务需求和飞行约束。以下是一个简单的例子,展示了如何为三维无人机航迹规划定义一个目标函数。 例子:最小化飞行时间和避障的三维无人机航迹规划 1.任务描述:无人机需要从起点飞到终点,同时避开一些…...

uniapp v-tabs修改了几项功能,根据自己需求自己改
根据自己的需求都可以改 这里写自定义目录标题 1.数组中的名字过长,导致滑动异常2.change 事件拿不到当前点击的数据,通过index在原数组中查找得到所需要的id 各种字段麻烦3.添加指定下标下新加红点显示样式 1.数组中的名字过长,导致滑动异常…...

用vscode,进行vue开发
使用Visual Studio Code(VSCode)进行Vue.js开发是一个很好的选择,因为VSCode提供了强大的编辑功能以及丰富的插件生态。以下是使用VSCode进行Vue开发的基本步骤: 1. 安装Node.js和npm 首先,确保你的计算机上安装了No…...

Kafka 磁道寻址过程详解
前言 Apache Kafka 是一款高吞吐、分布式的消息流平台,广泛应用于实时数据处理和事件驱动系统。在 Kafka 中,消息是存储在磁盘上的,这种高效的数据读写性能得益于 Kafka 独特的磁盘存储架构和寻址机制。本文将从 Kafka 的存储结构、磁道寻址…...

基于Spring Boot的社区药房系统
一、系统背景与目的 随着医疗改革的深入和社区医疗服务的不断完善,社区药房在居民健康保障中扮演着越来越重要的角色。然而,传统的药房管理方式存在着库存管理混乱、药品销售不透明、客户信息管理不规范等问题。为了解决这些问题,基于Spring…...

005 QT常用控件Qwidget_上
文章目录 前言控件概述QWidgetenable属性geometry属性windowTitle属性windowlcon属性 小结 前言 本文将会向你介绍常用的Qwidget属性 控件概述 Widget 是 Qt 中的核心概念. 英文原义是 “⼩部件”, 我们此处把它翻译为 “控件” . 控件是构成⼀个图形化界面的基本要素. QWi…...

机器学习之交叉熵
交叉熵(Cross-Entropy)是机器学习中用于衡量预测分布与真实分布之间差异的一种损失函数,特别是在分类任务中非常常见。它源于信息论,反映了两个概率分布之间的距离。 交叉熵的数学定义 对于分类任务,假设我们有&#…...

数据结构 ——前缀树查词典的实现
数据结构 ——前缀树查词典的实现 一、前缀树的概念 前缀树是一种多叉树结构,主要用于存储字符串。每个节点代表一个字符,路径从根节点到叶节点表示一个完整的字符串。前缀树的关键特征是 共享前缀,也就是说,如果两个字符串有相…...

MySQL 主从复制与高可用架构
一、MySQL 主从复制概述 (一)定义与作用 MySQL 主从复制是一种允许在多个 MySQL 数据库服务器之间进行数据同步的技术。简单来说,就是可以把数据从一个 MySQL 服务器(主服务器、主节点)复制到一个或多个从节点&#…...

【Golang】如何读取并解析SQL文件
一、背景 在数据库开发与维护过程中,我们经常需要执行大量的SQL语句。有时,这些SQL语句会被保存在一个文件中,以便于批量执行。为了方便地在Go语言中处理这些SQL文件,我们可以编写一个函数来读取并解析SQL文件中的语句。 二、实…...

git branch -r(--remotes )显示你本地仓库知道的所有 远程分支 的列表
好的,git branch -r 这个命令用于列出远程分支。让我详细解释一下: 命令: git branch -rdgqdgqdeMac-mini ProductAuthentication % git branch -rorigin/main作用: 这个命令会显示你本地仓库知道的所有 远程分支 的列表。它不…...

Typescript安装
建议全局安装npm i -g typescript安装好之后,就可以直接使用 tsc 来编译 ts 文件了可通过 tsc 回车查看 tsc 的各项配置信息,通过 tsc --version 查看版本号。编译我们现在可以创建一个 ts 文件,并将他编译成 js 文件,比如下面简单…...

使用C#在目录层次结构中搜索文件以查找目标字符串
例程以递归方式搜索目录层次结构中的文件以查找目标字符串。它可以搜索几乎任何类型的文件,即使它不包含 Windows 理解的文本。例如,它可以搜索 DLL 和可执行文件以查看它们是否恰好包含字符串。 下面的代码中显示的ListFiles 方法完成了大部分工作。 …...

基于Redis实现令牌桶算法
基于Redis实现令牌桶算法 令牌桶算法算法流程图优点缺点 实现其它限流算法 令牌桶算法 令牌桶是一种用于分组交换和电信网络的算法。它可用于检查数据包形式的数据传输是否符合定义的带宽和突发性限制(流量不均匀或变化的衡量标准)。它还可以用作调度算…...

[Java] 使用 VSCode 来开发 Java
目录 前言Java 环境怎么看自己是否已经配置完成?安装 JDK安装 Maven 环境修改 Maven 依赖源 完善 VS Code配置插件配置 Maven配置 Maven Settings配置 Maven 可执行文件地址 前言 由于使用 VSCode 编码已经成为习惯,并且它确实相对其他的 IDE 较为轻量化…...

奇怪的知识又增加了,ESP32下的Lisp编程:ULisp--Lisp for microcontrollers
ESP32下有MicroPython,那么我就在想,有Lisp语言支持吗?答案是果然有!有ULisp,专门为MCU设计的Lisp! 网址:uLisp - Lisp for microcontrollers 介绍:用于微控制器的 Lisp 适用于 Ar…...

STM32标准库学习之寄存器方法点亮LED灯
STM32C8T6最小系统开发板,点亮PC13引脚的LED灯 1.使能PC13引脚的定时器 PC13引脚为GPIOC组的第13个端口,GPIO的时钟使能定时器为RCC_APB2ENR,这是可以从手册中得出的,如下图所示 从下图可以得出,若要使能GPIOC端口&a…...

Jenkins:持续集成与持续部署的利器
🐇明明跟你说过:个人主页 🏅个人专栏:《未来已来:云原生之旅》🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、什么是Jenkins 2、Jenkins的起源 二、Jenkins的核心…...