Spring 知识点
Spring
1.1 Spring 简介
1.1.1 Spring 概念
- Spring是一个轻量级Java开发框架,最早有Rod Johnson创建
- 为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题
- Spring最根本的使命是解决企业级应用开发的复杂性,即简化Java开发。
- 使现有的技术更加容易使用,本身是一个大杂烩,整合了现有的技术框架!
spring 官网链接:Spring
spring 官网源码下载链接:Spring Framework
GitHub 下载地址:Spring源码 GitHub 下载地址
1.1.2 Spring 优点
- Spring是一个开源的免费的框架(容器)
- Spring是一个轻量级的、非入侵式的框架
- 控制反转(IOC),面向切面编程(AOP)
- 支持事务的处理,对框架整合的支持!
- 总的来说:Spring就是一个轻量级的控制反转(IOC)和面向切面编程的框架!
1.1.3 Spring 使用的 jar 包
- 使用 Spring 之前,需要导入两个 jar 包
- 将以下代码粘入 maven 即可
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.0.RELEASE</version>
</dependency>
<!-- 这个包用于之后与 mybatis 做整合 -->
<dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.2.0.RELEASE</version>
</dependency>
1.2 IOC 理论推导
1.2.1 什么是 IOC 理论推导
- IOC : 控制反转,将创建对象的权利交给用户
- 是面向对象编程中的一种设计原则,是一种想法
- 可以用来减低计算机代码之间的耦合度
- 其中最常见的方式叫做依赖注入
1.2.2 IOC 理论推导 代码演示
-
正常编写一个业务需要
-
UserDao接口
-
UserDaolmpl实现类
-
UserService 业务接口
-
UserServicelmpl 业务实现类
-
-
例如下面所示

- 我们在 service 层调用 userdao 层的方法
package com.qiaoer.service;import com.qiaoer.dao.UserDao;
import com.qiaoer.dao.impl.UserDaoImplMySql;public class UserServiceImpl implements UserSerivce{private UserDao userDao=new UserDaoImplMySql();@Overridepublic void getAllUser() {userDao.getAllUser();}
}
- 正常是这样调用的,但是这样同时存在着一个问题
- 当我们相应 dao 层的 Oracle 实现类时,就需要修改 new 的实现类,例如这样
package com.qiaoer.service;import com.qiaoer.dao.UserDao;
import com.qiaoer.dao.impl.UserDaoImplMySql;
import com.qiaoer.dao.impl.UserDaoImplOracle;public class UserServiceImpl implements UserSerivce{private UserDao userDao=new UserDaoImplOracle();@Overridepublic void getAllUser() {userDao.getAllUser();}
}
- 如果有好几种实现类,那用户每次需要修改时,都需要修改源代码
- 这里就需要利用 set 动态实现值的注入
- 具体代码如下
package com.qiaoer.service;import com.qiaoer.dao.UserDao;
import com.qiaoer.dao.impl.UserDaoImplMySql;
import com.qiaoer.dao.impl.UserDaoImplOracle;public class UserServiceImpl implements UserSerivce{private UserDao userDao;public void setUserDao(UserDao userDao) {this.userDao = userDao;}@Overridepublic void getAllUser() {userDao.getAllUser();}
}
- 刚刚是程序控制创建和调用对象
- 增加了 set 方法后,则是用户去选择实现,直接调用即可
1.2.3 IOC 理论推导总结
- 在我们之前的业务中,用户的需求可能会影响我们原来的代码,我们需要根据用户的需求去修改原代码!
- 如果程序代码量十分大,修改一次的成本代价十分昂贵!
- 当我们使用 set 方法实现了动态的注入后
- 之前,程序是主动创建对象!控制权在程序员手上
- 使用了set注入后,程序不再具有主动性,而是变成了被动的接受对象
- 这种思想,从本质上解决了问题,程序员不用再去管理对象的创建了
- 系统的耦合性大大降低~,可以更加专注的在业务的实现上!这是IOC的原型
1.3 IOC 容器
1.3.1 IOC 容器简介
- IOC (Inversion of Control,控制反转) 容器是一种用于管理和组织应用程序中组件(或对象)的框架
- 它是一种软件设计模式,旨在实现应用程序的松耦合,提高可维护性和可测试性
- IOC 容器通过控制对象的创建、依赖解析和生命周期管理,将对象的控制权从应用程序代码转移到容器中。
- IOC 容器是一个重要的软件设计工具,可以帮助开发者实现可维护、可扩展和可测试的应用程序
1.3.2 使用 Spring 创建对象
- 使用 Spring 之前,优先导入 Spring 的 jar 包
- 将以下代码复制进 maven 即可
<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>6.0.9</version></dependency>
- 在资源文件夹 resources 下创建一个名为 applicationContext.xml 的文件

-
在 spring 官网找到 ioc容器的元数据
-
**在官网的 ico容器概述内可以找到 网站:Container Overview :: Spring Framework **
-
网址: https://docs.spring.io/spring-framework/reference/core/beans/basics.html
-
进入官网下滑找到
<beans>标签的内容复制

- 或者直接复制我下方的代码
<?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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="..." class="..."><!-- collaborators and configuration for this bean go here --></bean><bean id="..." class="..."><!-- collaborators and configuration for this bean go here --></bean><!-- more bean definitions go here --></beans>
- 直接将这段代码放入刚刚创建的 applicationContext.xml 文件当中

- 这里的
<bean></bean>标签实际上就类似于 new 了一个对象 <bean>标签的 属性 id 代表对象的对象吗<bean>标签的属性 class 则代表引用的哪个类,要加上包名- Spring 使用示例 (applicationContext.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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="hello" class="com.qiaoer.entity.Hello"></bean>
</beans>

- 使用 ClassPathXmlApplicationContext 对象可以获取 Spring 的上下文
ApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
- 括号内的构造函数参数为 applicationContext.xml 即 Spring 配置文件的路径
- 使用
getBean(String id)方法可以获取具体的对象,括号内的参数对应 xml 文件当中为<bean>标签的 id 属性 - 示例,获取 Hello 类的对象
import com.qiaoer.entity.Hello;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test {public static void main(String[] args) {ApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");Hello hello = (Hello)classPathXmlApplicationContext.getBean("hello");System.out.println(hello);}
}
1.3.3 使用 Spring 为对象当中的属性赋值
- 使用
<bean>标签内的 子标签<property>来赋值 <property>标签语法
<property name="属性名" value="具体值"/>
<property>标签的 name 属性为对象中要赋值的属性名,value 属性是为属性赋的值- 使用
<property>赋值必须在类中为属性写有对应的 get 和 set 方法来赋值和取值 - 示例
<?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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="hello" class="com.qiaoer.entity.Hello"><property name="name" value="你好"/></bean>
</beans>
import com.qiaoer.entity.Hello;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test {public static void main(String[] args) {ApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");Hello hello = (Hello)classPathXmlApplicationContext.getBean("hello");System.out.println(hello.getName());}
}
- 如果我们要给属性赋的值是一个对象的引用的话 应使用
<property>标签的 ref 属性 而不是 value 属性 - 示例,现在新建一个 HelloSpring 的类,该为为 Hello 类的属性

- 在 applicationContext.xml 当中,应事先创建好 HelloSpring 的对象,然后使用 ref 属性指向该对象的应用
- 示例
<?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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 创建 HelloSpring 对象--><bean id="helloSpring" class="com.qiaoer.entity.HelloSpring"/><bean id="hello" class="com.qiaoer.entity.Hello">
<!-- 将该属性的引用指向 HelloSpring 对象--><property name="helloSpring" ref="helloSpring"/></bean>
</beans>
- ref 属性的值为要执行对象的 id 的值
- 这样就将 HelloSpring 对象赋给了 Hello 内的 HelloSpring 类型的属性
1.3.4 IOC 创建对象方式
- spring 默认创建对象时会调用类的无参构造
- 也可以通过自己给构造器赋值,来调用有参构造,主要有 3 种方式
- 需要使用
<bean>标签中的子标签<constructor-arg>来给构造器赋值 - 实体类 Hello 示例
package com.qiaoer.entity;public class Hello {private String name;private int age;public Hello(String name, int age) {this.name = name;this.age = age;System.out.println("name:"+this.name);System.out.println("age:"+this.age);}public Hello(String name) {this.name = name;System.out.println("name:"+this.name);}public Hello() {}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}
-
1、使用下标创建
- 示例
<?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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="hello" class="com.qiaoer.entity.Hello"><constructor-arg index="0" value="巧克力"/><constructor-arg index="1" value="17"/></bean> </beans>- 下标 0 表示构造器第一个参数 String name ,以此类推
- 通过下标赋值不用注意顺序
- 在创建此对象时则会直接调用有两个参数的有参构造
import com.qiaoer.entity.Hello; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test {public static void main(String[] args) {ApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");Hello hello = (Hello)classPathXmlApplicationContext.getBean("hello");} } -
2、使用类型创建
- 示例
<?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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="hello" class="com.qiaoer.entity.Hello"><constructor-arg type="int" value="17"/><constructor-arg type="java.lang.String" value="巧克力"/></bean> </beans>- 通过类型赋值时,当用相同类型的参数时,需要按照参数的顺序来赋值
- 类型赋值不建议使用,因为当有相同类型时,容易混淆
- 基本类型的可以直接写
- 引用类型需要加上包名
-
3、参数名创建
- 示例
<?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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="hello" class="com.qiaoer.entity.Hello"><constructor-arg name="age" value="17"/><constructor-arg name="name" value="巧克力"/></bean> </beans>- 使用参数名创建也不需要注意顺序
- 直接使用参数的名字便可赋值,推荐使用
a/beans"
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation=“http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd”>
- 使用参数名创建也不需要注意顺序
- 直接使用参数的名字便可赋值,推荐使用相关文章:
Spring 知识点
Spring 1.1 Spring 简介 1.1.1 Spring 概念 Spring是一个轻量级Java开发框架,最早有Rod Johnson创建为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题Spring最根本的使命是解决企业级应用开发的复杂性,即简化Java开发。使现有的技术更加容易使…...
目标跟踪与检测后进行 OpenCV 人脸识别 ,马赛克
文章大纲 简介模型下载地址ONNX 静态与动态 参数OpenCV 中支持的 人脸检测、识别Face detection 人脸检测YuNetFace recognition 人脸识别sFace目标检测,跟踪 后的人脸模糊问题汇总不支持动态输入的问题参考文献与学习路径简介 OpenCV 4.5.4版本收录了一个基于深度学习神经网…...
持有PMP证书,可申请CSPM证书!
一,CSPM介绍 CSPM的全称是:项目管理专业人员能力评价,是我们国内的“PMP”,是我们中国人自己的项目管理专业人士评价指南,符合中国国情且符合中国未来发展的项目管理专业人员能力评价标准。 2022年10月12日发布实施了…...
linux自定义网络访问规则
1.更改防火墙默认区域为trusted firewall-cmd --set-default-zonetrusted 2.新建一个zone,将想要访问本机80端口的ip,如:192.168.3.99 ,添加的这个zone中,同时在这个zone中放行80端口。 firewall-cmd --permanent --ne…...
247 个经典实用有趣的 Python 实例附源码
今天给大家整理了 247 个经典实用有趣的 Python 实例,185 页代码齐全可复制 pdf,几乎涵盖了 Python 各个方面的知识点,即可以帮助小白快速全面的学习 Python,也可以让老手通过实战练习来查缺补漏。 福利:文末有chat-g…...
动手学深度学习Pytorch 4.4练习
1.这个多项式回归问题可以准确地解出吗?提⽰:使⽤线性代数。 可以,把多项式问题,用matlab的str2sym表示出来,再用solve求解。 2.考虑多项式的模型选择。 1. 绘制训练损失与模型复杂度(多项式的阶数)的关系…...
【计算机视觉 | Kaggle】飞机凝结轨迹识别 Baseline 分享和解读(含源代码)
文章目录 一、导读二、比赛背景三、比赛任务四、比赛数据五、评价指标六、Baseline6.1 Training part6.2 Submission part 一、导读 比赛名称:Google Research - Identify Contrails to Reduce Global Warming https://www.kaggle.com/competitions/google-researc…...
ThinkPHP文件上传:简便安全的解决方案
在现代Web应用程序中,文件上传是一项常见而重要的功能。ThinkPHP是一种流行的PHP开发框架,提供了便捷而安全的文件上传解决方案。本文将介绍ThinkPHP框架中的文件上传功能,并探讨如何使用它来实现安全可靠的文件上传功能。 一、ThinkPHP文件…...
torch.multiprocessing
文章目录 张量共享torch.multiprocessing.spawnmultiprocessing.Pool与torch.multiprocessing.Pool阻塞非阻塞map阻塞非阻塞 starmap torch.multiprocessing是具有额外功能的multiprocessing,其 API 与multiprocessing完全兼容,因此我们可以将其用作直接…...
解决本地代码commit后发现远程分支被更新的烦恼!
解决本地代码commit后远程分支更新的烦恼! 在进行代码开发过程中,当我们准备将本地代码推送到远程分支时,有时会遇到远程分支已经被更新的情况。这给我们的开发工作带来了一些挑战,因为我们需要确保我们的修改与远程分支的更新保持…...
最新AI创作系统ChatGPT程序源码+详细搭建部署教程+微信公众号版+H5源码/支持GPT4.0+GPT联网提问/支持ai绘画+MJ以图生图+思维导图生成!
使用Nestjs和Vue3框架技术,持续集成AI能力到系统! 新增 MJ 官方图片重新生成指令功能同步官方 Vary 指令 单张图片对比加强 Vary(Strong) | Vary(Subtle)同步官方 Zoom 指令 单张图片无限缩放 Zoom out 2x | Zoom out 1.5x新增GPT联网提问功能、手机号注…...
910数据结构(2014年真题)
算法设计题 问题1 已知一个带头结点的单链表head,假设结点中的元素为整数,试编写算法:按递增次序输出单链表中各个结点的数据元素,并释放结点所占的存储空间。要求:(1)用文字给出你的算法思想;(2)不允许使…...
Idea创建maven管理的web项目
如果你想在项目中添加一个传统的 src 目录来存放源代码,可以按照以下步骤操作: 1. 在项目视图中,右键单击项目名称,选择 “New” -> “Directory”。 2. 在弹出的对话框中,输入目录名称为 “src”,然后…...
Java并发编程(一)多线程基础概念
概述 多线程技术:基于软件或者硬件实现多个线程并发执行的技术 线程可以理解为轻量级进程,切换开销远远小于进程 在多核CPU的计算机下,使用多线程可以更好的利用计算机资源从而提高计算机利用率和效率来应对现如今的高并发网络环境 并发编程…...
D. Strong Vertices - 思维 + 二分
分析: 首先找到边的指向很容易,但是暴力是o(n2),超时,可以将给定的式子变形,au - av > bu - bv即au - bu > av - bv,可以将两个数组转变为一个数组中的任意两个值之间的关系,因…...
8月9日上课内容 nginx负载均衡
负载均衡工作当中用的很多的,也是面试会问的很重要的一个点 负载均衡:通过反向代理来实现(nginx只有反向代理才能做负载均衡) 正向代理的配置方法(用的较少) 反向代理的方式:四层代理与七层代…...
为何我们都应关心算法备案?
随着技术的日新月异,算法成为现代生活的核心组成部分,从社交媒体推荐、在线广告到智能交通管理,几乎无处不在。然而,如此普及的技术给我们带来了一个新的挑战:如何确保算法的透明度、公正性和道德性?答案可…...
[IDEA]使用idea比较两个jar包的差异
除了一些小工具外,idea自带了jar包比较的功能。 把需要比对的jar包放到任意目录下,然后选中两个需要比较的jar包,右键,选择Compare Archives,然后就可以比较了。 这次疏忽了,每次打包前需要commit界面看一下…...
HTML笔记(2)
列表标签 项目标识符(项目符号)一般是不需要的 代码演示 改变符号样式,type属性 表格标签 代码演示 练习案例 布局标签 div是块儿级标签,占一整行; span标签不会占一整行,它只占包裹内容的那块儿区域&a…...
前端大屏自适应缩放
简介 前端中大屏往往用于展示各种炫酷的界面和特效,因此特别受用好欢迎。 但是在开发过程中,常常也会出现各种问题,与一般的页面相比, 最让人头疼的是大屏的自适应问题。使用CSS中transform属性和js获取缩放比例方法 先简单写一下…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...
手机平板能效生态设计指令EU 2023/1670标准解读
手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...
Python竞赛环境搭建全攻略
Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型(算法、数据分析、机器学习等)不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...
