1、Spring_IOC
IOC
1.概述
- IOC:Inversion of Control 控制反转,可以让容器负责对象的创建以及销毁操作,对象在容器中叫 bean

2.回顾问题
-
问题:写了太多与业务无关的代码
- 耦合度非常高,写了很多和业务无关的代码
- 不利于项目的升级迭代
-
思考的解决方案
-
能够直接获取 mapper 接口,而不必去关心底层的获取方式

-
3.bean 配置
3.1.创建 spring01 项目
-
项目结构如下
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ox468aeu-1692499957253)(picture/image-20221026180412182.png)]](https://img-blog.csdnimg.cn/908e1f38fca64299bf54846bb6cc7a34.png)
-
添加 Spring 依赖
<dependencies> <!-- 添加 spring 依赖--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.17.RELEASE</version></dependency> <!-- 添加 junit 依赖--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version> <!-- <scope>test</scope>--></dependency></dependencies>
3.2.添加 Student 类
-
创建空学生类
public class Student { }
3.3.添加 Spring 配置文件
-
添加方式如下
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5AxTNnQW-1692499957257)(picture/image-20221026180840332.png)]](https://img-blog.csdnimg.cn/49e550fec28640bd9eb54f37ac4757e2.png)
-
开始配置 javabean
<?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"> <!-- 配置 Student 学生类--><bean id="student" name="stu" class="cn.sycoder.domian.Student"></bean> </beans>
4.属性介绍
| 属性名称 | 说明 |
|---|---|
| id | 给 bean 起名字(定义id 不能重复) |
| name | 给 bean 起别名 |
| class | 类全限定类名 |
4.容器创建
4.1.ClassPathXmlApplicationContext
- 从classPath下寻找
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
System.out.println(context);
4.2.FileSystemXmlApplicationContext
- 从系统文件下寻找
ApplicationContext ctx = new FileSystemXmlApplicationContext("绝对路径地址");
-
使用 ClassPathXmlApplicationContext 获取方式会出现如下问题
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6kjqHuNO-1692499957258)(picture/image-20221026182206916.png)]](https://img-blog.csdnimg.cn/10c5f8b83d444cf7805a09917bb457c7.png)
5.从容器中获取 bean
5.1.根据id 获取
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");//从容器中根据 id 获取 bean 对象
Student stu = (Student)context.getBean("student");//通过别名获取 bean 对象
Student stuByName = (Student)context.getBean("stu");
- 注意:如果id重复会有如下问题
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jBKxVpJX-1692499957259)(picture/image-20221026183925757.png)]](https://img-blog.csdnimg.cn/80de2682ebad4e038b35264acf283d92.png)
5.2.根据id和类型
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
final Student student = context.getBean("student", Student.class);
5.3.根据类型获取bean
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
final Student bean = context.getBean(Student.class);
- 注意:使用类型获取的时候,一定要保证容器中只有一个 javabean 对象
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qno96Rak-1692499957261)(picture/image-20221026183708897.png)]](https://img-blog.csdnimg.cn/1ea6f6c48acb4b3a9b8fc3fd625f5122.png)
5.4.注意点
-
bean 的配置spring 是使用反射调用对象的无参构造器实现的。所以必须提供无参构造器,否则会出现如下错误
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xg1jELcK-1692499957262)(picture/image-20221026184148621.png)]](https://img-blog.csdnimg.cn/90403473139e4830973a0299e10baf4d.png)
6.设计模式
6.1.单例模式
-
概述:属于创建型模式,提供了创建对象的最佳方式。单例模式只能有一个单一的类
-
懒汉式单例模式:需要用的时候,再去把对象创建出来
public class SingleObject {//线程不安全的懒汉式单例模式private static SingleObject instance;public static SingleObject getInstance(){if(instance == null){instance =new SingleObject();}return instance;}} -
饿汉式单例模式:不管你有没有,我先创建出来
public class SingleObjectE {//线程不安全的饿汉式单例模式private static SingleObjectE instance = new SingleObjectE();public static SingleObjectE getInstance(){return instance;} }
6.2.工厂模式
-
概述:也是属于创建型模式,目的也是提供创建对象的最佳方式
-
静态工厂
public class BeanFactory {public static Student getBean() {return new Student();}public static Object getBean(String name) {if ("Student".equals(name))return new Student();else if("SingleObject".equals(name)) {return new SingleObject();}else{return new Object();}}} -
实例工厂
public class BeanFactory {public Object getBean(){return new Student();} }
6.3.通过反射获取 xml 配置创建对象、
-
模拟实现
IOC获取对象 -
导依赖
<dependency><groupId>org.dom4j</groupId><artifactId>dom4j</artifactId><version>2.1.3</version> </dependency> <dependency><groupId>jaxen</groupId><artifactId>jaxen</artifactId><version>1.2.0</version> </dependency> -
代码实现
public class XmlCreateBean {/*** 模拟spring 容器创建 javabean* @param configName* @param id* @return*/public static Object getBean(String configName,String id){final SAXReader saxReader = new SAXReader();try {final Document dom = saxReader.read(configName);final Element element = dom.getRootElement();final List<Element> beans = element.elements("bean");//获取每一个 beanfor (Element bean : beans) {if(id.equals(bean.attributeValue("id"))){final String aClass = bean.attributeValue("class");final Class<?> clz = Class.forName(aClass);return clz.newInstance();}}} catch (Exception e) {e.printStackTrace();}return null;} }
7. bean实例化
- bean 交给 spring 创建,底层究竟是怎么创建的?
- 实例化 bean 三种方式:
- 构造器(常用)
- 静态工厂方法
- 实例工厂方法
- 实现 FactoryBean(常用)
1.无参构造器实例化
-
新建 person 类,底层是通过 clz.getDeclaredClasses() 获取构造器
public class Person {public Person(){}} -
配置 Person bean
<bean id="person" class="cn.sycoder.domian.Person"></bean> -
从容器中获取 bean
@Testpublic void testConstructorInit(){final ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");Person p = (Person) context.getBean("person");} -
修改构造器,添加参数测试,提示找不到无参构造器

![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IvDyDbZO-1692517619467)(picture/image-20221027095741037.png)]](https://img-blog.csdnimg.cn/de7697f354fc4e89b588350de4aca866.png)
2.静态工厂方法实例化
-
创建 clintServer 类,提供静态工厂方法
public class ClientServer {//创建自身对象并且私有化private static ClientServer clientServer = new ClientServer();private ClientServer() {}public static ClientServer createInstance(){return clientServer;} } -
配置bean 的 xml
<bean id="clientServer" class="cn.sycoder.domian.ClientServer" factory-method="createInstance"></bean> -
获取 bean
@Testpublic void testFactoryStaticMethodInit(){final ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");final ClientServer bean = context.getBean(ClientServer.class);}![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8eLi3vVy-1692517619469)(picture/image-20221027100822350.png)]](https://img-blog.csdnimg.cn/40d83afbfb114f469737a4ae10ebcace.png)
-
配置关系
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-noejAEeq-1692517619470)(picture/image-20221027102210357.png)]](https://img-blog.csdnimg.cn/5fc694d067a849b28a413b543ffd1a3a.png)
3.实例工厂方法实例化
-
创建实例工厂类
public class ClientServiceFactory {private static ClientService instance = new ClientService();private ClientServiceFactory(){}public ClientService getInstance(){return instance;} }public class ClientService { } -
配置 bean
<!-- 配置工厂--><bean id="clientFactory" class="cn.sycoder.domian.ClientServiceFactory"></bean> <!-- 配置 clientService--><bean id="clientService" factory-bean="clientFactory" factory-method="getInstance"></bean> -
获取bean
@Testpublic void testFactoryInstanceMethodInit(){final ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");final ClientService bean = context.getBean(ClientService.class);} -
配置关系
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eumHoxKB-1692517915886)(picture/image-20221027102041002.png)]](https://img-blog.csdnimg.cn/46760053f7134617a24ca16c4b8b3bac.png)
4.FactoryBean
-
创建员工类
public class Employee {public void check(){System.out.println("检查是否能够拿到员工类对象");} } -
创建员工 factory 类实现 FactoryBean
public class EmployeeFactory implements FactoryBean<Employee> {public Employee getObject() throws Exception {System.out.println("获取 emp 对象");return new Employee();}public Class<?> getObjectType() {return Employee.class;}public boolean isSingleton() {return false;} } -
配置工厂类(并没有直接配置 emp 类)
<bean id="employee" class="cn.sycoder.domian.EmployeeFactory"></bean> -
获取 emp 对象
@Testpublic void testFactoryBeanInit(){final ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");final Employee emp = (Employee)context.getBean("employee");emp.check();} -
实现方法说明
-
isSingleton:如果是 true 返回单例的对象
public boolean isSingleton() {return true;} -
getObject:进行对象创建的
public Employee getObject() throws Exception {System.out.println("获取 emp 对象");return new Employee(); }
-
相关文章:
1、Spring_IOC
IOC 1.概述 IOC:Inversion of Control 控制反转,可以让容器负责对象的创建以及销毁操作,对象在容器中叫 bean 2.回顾问题 问题:写了太多与业务无关的代码 耦合度非常高,写了很多和业务无关的代码不利于项目的升级迭…...
Socks5、IP代理在爬虫开发与HTTP通信中的应用
随着互联网的不断发展,代理服务器成为网络工程师和数据爬虫开发者的关键工具。本文将深入探讨Socks5代理、IP代理以及它们在网络安全、爬虫开发和HTTP通信中的重要作用。 1. 代理服务器:保障隐私与安全的中间人 代理服务器是位于客户端与目标服务器之间…...
重新认识小米
被镁光灯聚焦的企业,总是会被贴上各种标签。 8月14日,小米科技创始人雷军以“成长”为主题的年度演讲,刷遍社交网络。提到小米,你首先想到什么?手机发烧友、极致性价比,还是最年轻的500强? 这…...
react之react-redux的介绍、基本使用、获取状态、分发动作、数据流、reducer的分离与合并等
react之react-redux的介绍、基本使用、获取状态、分发动作、数据流、reducer的分离与合并等 一、react-redux介绍二、React-Redux-基本使用三、获取状态useSelector四、分发动作useDispatch五、 Redux 数据流六、代码结构七、ActionType的使用八、Reducer的分离与合并九、购物挣…...
滑块验证码-接口返回base64数据
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言所需包图片示例使用方法提示前言 滑动验证码在实际爬虫开发过程中会遇到很多,不同网站返回的数据也是千奇百怪。这里分享一种接口返回base64格式的情况以及处理方式 所需包 opencv-python、…...
智能文件改名,一键与上上级目录名称同步,让文件整理更加便捷
在整理文件时,经常会遇到需要将文件名称与上上级目录名称保持一致的情况。手动逐个修改文件名不仅费时费力,还容易出错。现在,我们为你带来了一款智能文件改名工具,让你能够一键将文件名称改成跟上上级目录名称一样,让…...
RK3399平台开发系列讲解(内核调试篇)Valgrind使用案例
🚀返回专栏总目录 文章目录 一、使用未初始化的内存案例二、内存泄露三、在内存被释放后进行读/写案例四、从已分配内存块的尾部进行读/写案例五、两次释放内存案例沉淀、分享、成长,让自己和他人都能有所收获!😄 📢Valgrind 是一个开源的内存调试和性能分析工具,用于…...
07_缓存预热缓存雪崩缓存击穿缓存穿透
缓存预热&缓存雪崩&缓存击穿&缓存穿透 一、缓存预热 提前将数据从数据库同步到redis。 在程序启动的时候,直接将数据刷新到redis懒加载,用户访问的时候,第一次查询数据库,然后将数据写入redis 二、缓存雪崩 发生情…...
常见前端基础面试题(HTML,CSS,JS)(三)
JS 中如何进行数据类型的转换? 类型转换可以分为两种,隐性转换和显性转换 显性转换 主要分为三大类:数值类型、字符串类型、布尔类型 三大类的原始类型值的转换规则我就不一一列举了 数值类型(引用类型转换) Numbe…...
CSS(JavaEE初阶系列14)
目录 前言: 1.CSS是什么 1.1CSS基本语法 2.引入样式 2.1内部样式表 2.2行内样式表 2.3外部样式 3.选择器 3.1选择器的种类 3.1.1基础选择器 3.1.2复合选择器 4.常用元素属性 4.1字体属性 4.2文本属性 4.3背景属性 4.4圆角矩形 4.5元素的显示模式 4…...
学习笔记230810--get请求的两种传参方式
问题描述 今天写了一个对象方式传参的get请求接口方法,发现没有载荷,ip地址也没有带查询字符串,数据也没有响应。 代码展示 错误分析 实际上这里的query是对象方式带参跳转的参数名,而get方法对象方式传参的参数名是parmas 解…...
游戏找不到msvcr100.dll解决方法,常见的三种解决方法
在计算机领域,msvcr100.dll是一个非常重要的动态链接库文件。它是Microsoft Visual C 2010 Redistributable的一部分,用于支持Visual Studio 2010的开发环境。然而,在某些情况下,msvcr100.dll可能会出现问题,导致程序无…...
机器学习知识点总结:什么是GBDT(梯度提升树)
什么是GBDT(梯度提升树) 虽然GBDT同样由许多决策树组成,但它与随机森林由许多不同。 其中之一是GBDT中的树都是回归树,树有分类有回归,区分它们的方法很简单。将苹果单纯分为好与坏的是分类树,如果能为苹果的好坏程度打个分&…...
SpringBoot + Vue 微人事权限组管理模块 (十四)
权限组前端页面制作 权限组管理角色和菜单之间关系,操作员管理着用户和角色之间的关系。 英文的输入框要有个前缀,SpringSecurity里角色英文名需要加一个ROLE_的前缀 上代码 <div><div class"permissManaTool"><el-input pla…...
Liunx系统编程:进程信号的概念及产生方式
目录 一. 进程信号概述 1.1 生活中的信号 1.2 进程信号 1.3 信号的查看 二. 信号发送的本质 三. 信号产生的四种方式 3.1 按键产生信号 3.2 通过系统接口发送信号 3.2.1 kill -- 向指定进程发送信号 3.2.2 raise -- 当自身发送信号 3.2.3 abort -- 向自身发送进程终止…...
宝塔端口监听不到端口
场景: 两个服务器同时在安装nginx 出问题导致20011没有在监听,重新删除nginx 就行了 当时一直以为是安全组没有放过端口,其实是没有监听 排查问题 php -S 0.0.0.0:端口 如果可以访问说明链接可以到服务器只是nginx没监听 sudo netstat …...
机器学习入门的概念
导航 一、 人工智能,机器学习,深度学习和传统学习二、数学基础三、编程语言 如果你刚刚入门机器学习,会接触到了非常多的概念。比如人工智能,机器学习,深度学习,神机网络,强化学习,各…...
插入排序优化——超越归并排序的超级算法
插入排序及优化 插入排序算法算法讲解数据模拟代码 优化思路一、二分查找二、copy函数 优化后代码算法的用途题目:数星星(POJ2352 star)输入输出格式输入格式:输出格式 输入输出样例输入样例输出样例 题目讲解步骤如下AC 代码 插入…...
面试之快速学习STL-容器适配器
1. 容器适配器 简单的理解容器适配器,其就是将不适用的序列式容器(包括 vector、deque 和 list)变得适用。 注意:默认使用的基础容器不代表一定只能用它,比如queue可以用deque,list。 如果你希望你的qu…...
性能比较 - Spring Boot 应用程序中的线程池与虚拟线程 (Project Loom)
本文比较了 Spring Boot 应用程序中的不同请求处理方法:ThreadPool、WebFlux、协程和虚拟线程 (Project Loom)。 在本文中,我们将简要描述并粗略比较可在 Spring Boot 应用程序中使用的各种请求处理方法的性能。 高效的请求处理在开发高性能后端…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
自然语言处理——文本分类
文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益(IG) 分类器设计贝叶斯理论:线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别, 有单标签多类别文本分类和多…...
使用SSE解决获取状态不一致问题
使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件,这个上传文件是整体功能的一部分,文件在上传的过程中…...
