Spring(一):Spring 的创建和使用

目录

Spring 是什么?

什么是容器?

什么是 IoC?

什么是 IoC?

IoC的优点是啥呢?

理解 IoC

DI 概念说明

Spring 的创建

创建 Spring 项目

1. 创建⼀个普通 Maven 项⽬。

2. 添加 Spring 框架⽀持(spring-context、spring-beans)。

3. 添加启动类

将 bean 对象存储到 Spring(IoC)中

 将 bean 对象从 Spring(IoC)中 取出


在开始Spring的创建和使用之前先来看看Spring的基本概念

Spring 是什么?

我们通常所说的 Spring 指的是 Spring Framework(Spring 框架),它是⼀个开源框架,有着活跃⽽庞⼤的社区,这就是它之所以能⻓久不衰的原因。Spring ⽀持⼴泛的应⽤场景,它可以让 Java 企业级的应⽤程序开发起来更简单。
⽤⼀句话概括 Spring:Spring 是包含了众多⼯具⽅法的 IoC 容器。                                                  这里的众多工具体现在哪呢?这个慢慢学Spring都会介绍到。  
那问题来了,什么是容器?什么是 IoC 容器?

什么是容器?

容器就是用来装某个物体的,我们之前就有学过容器:

  • List/Map -> 数据存储容器
  • Tomcat -> Web 容器

什么是 IoC?

Spring 也是⼀个容器,Spring 是什么容器呢?Spring 是⼀个 IoC 容器

什么是 IoC?

IoC = Inversion of Control 翻译成中⽂是“控制反转”的意思,也就是说 Spring 是⼀个“控制反转”的容器,怎么理解这句话呢?

控制(权)反转,指的是:对象的生命周期的控制权(原本属于  程序员/代码片段  控制),现在交给了Spring容器控制或者是IoC 容器控制

IoC的优点是啥呢?

答:可以实现解耦合(松耦合)

我们具体来举个栗子,具体的看看IoC的实现。

我们就创建一个普通的类:

我们的需求是这样的:

  • 我们创建一辆车依赖了车的车身;
  • 这个框架又依赖着车的底盘
  • 这个底盘又依赖着车的轮胎

代码如下:

 车身依赖底盘

 底盘依赖轮胎

轮胎本身自带一个size 属性:

ok,旧的需求写到这里,我们客户现在需要自己规定轮胎大小,而不是每次都默认大小,那么从最底层 Tire 开始要进行传参 int size 

此时就开始体现了耦合性太高,假设我们又有一个需求,需要换车身颜色呢?又需要从最底层开始向上修改到最高层所有的参数。

那么如果是用IoC 容器就很好的解决了这个问题。

这就很好的进行了  解耦合。

对比总结:

在传统的代码中对象创建顺序是:Car -> Framework -> Bottom -> Tire
改进之后解耦的代码的对象创建顺序是:Tire -> Bottom -> Framework -> Car

理解 IoC

回到我们的主题 Spring,本⽂刚开始咱们就讲:Spring 是包含了多个⼯具⽅法的 IoC 容器,这就是对 Spring 最核⼼的总结。“集成多个⼯具⽅法”这事咱们以后慢慢再讲,那如何理解“Spring 是⼀个 IoC 容器”这句话呢?
既然 Spring 是⼀个 IoC(控制反转)容器,重点还在“容器”⼆字上,那么它就具备两个最基础的功
能:

  1. 将对象存⼊到容器;
  2. 从容器中取出对象。

也就是说学 Spring 最核⼼的功能,就是学如何将对象存⼊到 Spring 中,再从 Spring 中获取对象的过程。

将对象存放到容器中的好处:将对象存储在 IoC 容器相当于将以后可能⽤的所有⼯具制作好都放到仓库中,需要的时候直接取就⾏了,⽤完再把它放回到仓库。⽽ new 对象的⽅式相当于,每次需要⼯具了,才现做,⽤完就扔掉了也不会保存,下次再⽤的时候还得重新做,这就是 IoC 容器和普通程序开发的区别。

 Spring 是⼀个 IoC 容器,说的是对象的创建和销毁的权利都交给 Spring 来管理了,它本身⼜具备了存储对象和获取对象的能⼒

DI 概念说明

说到 IoC 不得不提的⼀个词就是“DI”,DI 是 Dependency Injection 的缩写,翻译成中⽂是“依赖注
⼊”的意思。
所谓依赖注⼊,就是由 IoC 容器在运⾏期间,动态地将某种依赖关系注⼊到对象之中。所以,依
赖注⼊(DI)和控制反转(IoC)是从不同的⻆度的描述的同⼀件事情,就是指通过引⼊ IoC 容
器,利⽤依赖关系注⼊的⽅式,实现对象之间的解耦。

二者的区别:
IoC 是“⽬标”也是⼀种思想,⽽⽬标和思想只是⼀种指导原则,最终还是要有可⾏的落地⽅案,⽽ DI就属于具体的实现

Spring 的创建

Spring 就是⼀个包含了众多⼯具⽅法的 IoC 容器。既然是容器那么
它就具备两个最基本的功能:

  1. 将对象存储到容器(Spring)中;
  2. 从容器中将对象取出来

那么本章的重点就是 怎么存怎么取

创建 Spring 项目

接下来使⽤ Maven ⽅式来创建⼀个 Spring 项⽬,创建 Spring 项⽬和 Servlet 类似,总共分为以下 3步:

  1. 创建⼀个普通 Maven 项⽬。
  2. 添加 Spring 框架⽀持(spring-context、spring-beans)。
  3. 添加启动类

步骤:

1. 创建⼀个普通 Maven 项⽬。

 2. 

 3. 打开后就是这样的maven 项目:

这里还不算完,这里还需要正确配置 maven 国内源(学习Java 最容易出错的地方就是 Spring):

 正确配置 maven 国内源

 

 我们还需要去这个目录底下看一看:

情况 1 :

有些电脑会没有 settings.xml ,那么直接下载

链接:https://pan.baidu.com/s/1ctb6n0TLAy3QjmjvWNXZYw 
提取码:1234 

我已经上传至我的百度网盘,这个文件很小,只有 10k 。

切记,千万不要手动创建 settings.xml 文件。

如果是上述情况,那么到这里就ok 了。

情况 2 :

如果有这个文件,那么需要用记事本或者 vscode 打开:

找到 mirrors 这个标签,在这个标签下手动添加:

<mirror><id>nexus-aliyun</id><mirrorOf>central</mirrorOf><name>Nexus aliyun</name><url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>

 到这里,配置第一步就完成了。

然后,我们需要将repository 这个目录地下的所有文件删除:

ctrl + A 全选中,然后 delete 。

这个是可以删的,我们idea 在后台会自动去搜索 本地仓库是否存在它依赖的文件(资源),如果不存在,idea 会去Maven 中央仓库下载,我们上述正确配置 了 Maven 国内源,它会下载的很快。

我们手动的强制刷新以下,idea 就会开始下载 。

 稍等一会就欧克了。

2. 添加 Spring 框架⽀持(spring-context、spring-beans)。

 在项⽬的 pom.xml 中添加 Spring 框架的⽀持,xml 配置如下:

<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.3.RELEASE</version>
</dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>5.2.3.RELEASE</version>
</dependency>

从上述配置中可以看出,添加的框架有 spring-context:spring 上下⽂,还有 spring-beans:管理对象的模块。

3. 添加启动类

最后在创建好的项⽬ java ⽂件夹下创建⼀个启动类,包含 main ⽅法即可

将 bean 对象存储到 Spring(IoC)中

创建一个 bean 对象:

将 bean 存入到 Spring 中:

先创建一个配置文件:

 具体的配置信息:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:content="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd (空格)http://www.springframework.org/schema/context (空格)https://www.springframework.org/schema/context/spring-context.xsd"></beans>

 将 bean 对象从 Spring(IoC)中 取出

获取到Spring 上下文对象:

得到 Spring 上下⽂对象,因为对象都交给 Spring 管理了,所以获取对象要从 Spring 中获取,那
么就得先得到 Spring 的上下⽂。

 获取 bean 对象 

通过 Spring 上下⽂,获取某⼀个指定的 Bean 对象。

这里getBean()获取到的是一个 Object 对象,所以需要强转

我们来看看结果如何:

 当然,我们不止有以上的方法 获取到Spring 上下文对象,我们还可以用:

 这样其实也可以获取 Spring 对象,我们来看看效果:

 既然都可以获取到 Bean 对象我们来看看二者的区别(这也是面试会问的考点):

  • 相同点:都是容器管理对象,都可以获取到 Bean对象
  • 区别:
  1. ApplicationContext 属于 BeqnFactory 的子类,ApplicationContext 可以实现更多功能,具体有(对国际化⽀持、资源访问⽀持、以及事件传播等⽅⾯的⽀持)
    
  2. 加载Bean 的机制不同:BeqnFactory 属于懒加载,按需加载(使用一个 Bean则加载一个 Bean),ApplicationContext 一次性全部加载

第二点的出现原因在于:BeqnFactory 出现时间比 ApplicationContext 早,在早期空间十分有限,过去的硬件资源太昂贵了,现在硬件的资源大幅度下降。

案例演示:

我们再添加 一个 Teacher 类,并加上一个构造方法,同理原来的 User 也加上一个构造方法:

将这两个 Bean 对象都存入 容器中:

 再来对比二者结果:

ApplicationContext :

我们再来看看 BeqnFactory:

getBean的更多用法

这里的坑还是很多的,我们来简单介绍结果

用法一:根据名称获取 Bean 对象

 用法二:根据类型获取 Bean 对象

 可能出现的问题:当同一个类型多个注入到 Spring 的情况下,那么使用就会报错:

用法三:根据名称 + 类型获取

总结:

1. 操作容器之前,先要有容器,所以先要得到容器。
2. 存对象
        a. 创建 Bean(普通类)。
        b. 将 Bean 注册(配置)到 spring-confing.xml 中。
3. 取对象
        a. 得到 Spring 上下⽂,并读取到 Spring 的配置⽂件。
        b. 获取某⼀个 Bean 对象。
        c. 使⽤ Bean 对象

操作流程如下:

 Spring 就是个框架,我们要使用框架就应该很简单,这样获取和存储,还是很麻烦,我们下一章会介绍更简单的 存储方式 和 获取方式。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于FPGA的按键消抖

文章目录 基于FPGA的按键消抖一、按键消抖原理二、按键消抖代码三、仿真代码编写四&#xff1a;总结 基于FPGA的按键消抖 一、按键消抖原理 按键抖动&#xff1a;按键抖动通常的按键所用开关为机械弹性开关&#xff0c;当机械触点断开、闭合时&#xff0c;由于机械触点的弹性…

uboot移植裁剪原理和流程

一、Uboot的裁剪是裁剪什么&#xff1f; Uboot的裁剪分为两个方面&#xff1a;Uboot本身命令的裁剪和具体SoC硬件配置的裁剪。 1、Uboot本身命令的裁剪   Uboot提供了很多的操作命令&#xff0c;我们使用Uboot的时候通常只使用最常用的一些命令&#xff0c;其他很多的命令有…

类 和 对象

目录 1、面向对象编程 2、面向对象编程 2.1面向对象编程特征 3、类和对象的概念 3.1类的定义 3.11属性 3.12方法 3.13重载 3.14递归 3.13返回值return 3.2对象 3.2.1对象组合 4、jvm内主要三块内存空间 5、参数传值 1、面向对象编程 面向过程&#xff1a;关注的是步骤…

webpack笔记二

文章目录 背景拆分环境清除上次构建产物插件&#xff1a;clean-webpack-plugin合并配置文件插件&#xff1a;webpack-merge实时更新和预览效果&#xff1a;webpack-dev-server babel配置参考 背景 webpack笔记一 在前面的学习&#xff0c;完成了webpack的基本配置&#xff0c…

【云原生】k8s之包管理器Helm

前言 每个成功的软件平台都有一个优秀的打包系统&#xff0c;比如Debian、Ubuntu 的 apt&#xff0c;RedHat、CentOS 的 yum。Helm 则是 Kubernetes上 的包管理器&#xff0c;方便我们更好的管理应用。 1.Helm的相关知识 1.1 Helm的简介与了解 Helm本质就是让K8s的应用管理&…

Profibus DP主站转Modbus TCP网关profibus从站地址范围

远创智控YC-DPM-TCP网关。这款产品在Profibus总线侧实现了主站功能&#xff0c;在以太网侧实现了ModbusTcp服务器功能&#xff0c;为我们的工业自动化网络带来了全新的可能。 远创智控YC-DPM-TCP网关是如何实现这些功能的呢&#xff1f;首先&#xff0c;让我们来看看它的Profib…

Linux 学习记录52(ARM篇)

Linux 学习记录52(ARM篇) 本文目录 Linux 学习记录52(ARM篇)一、汇编语言相关语法1. 汇编语言的组成部分2. 汇编指令的类型3. 汇编指令的使用格式 二、基本数据处理指令1. 数据搬移指令(1. 格式(2. 指令码类型(3. 使用示例 2. 立即数(1. 一条指令的组成 3. 移位操作指令(1. 格式…

Meta 最新发布 LLaMA 2(允许商业化)

2023年7月18日&#xff0c;Meta 发布了LLaMA 2&#xff0c;包含7B&#xff0c;13B&#xff0c;70B三种参数&#xff08;34B暂时还未发布&#xff09;。 官方&#xff1a; https://ai.meta.com/llama/ 论文&#xff1a;Llama 2: Open Foundation and Fine-Tuned Chat Models 模型…

网络编程——RPC与HTTP基本介绍、历史追溯、主流应用场景、对比分析、为什么还需要使用RPC

一、HTTP与RPC基本介绍 HTTP协议&#xff08;Hyper Text Transfer Protocol&#xff09;超文本传输协议&#xff1a; 一个用于在网络上交换信息的标准协议&#xff0c;它定义了客户端(例如浏览器)和服务器之间的通信方式。如平时上网在浏览器上敲个网址url就能访问网页&#x…

关于电脑显示器屏幕看不出灰色,灰色和白色几乎一样无法区分,色彩调整方法

问题&#xff1a; 电脑显示器屏幕看不出灰色&#xff0c;灰色和白色几乎一样无法区分。白色和灰色有色差。 解决方法&#xff1a; 打开“控制面板” ->“色彩管理” ->“高级” ->“校正显示器” 在下一步调节中调成中间这一个实例的样子就可以了 进行微调&#x…

如何用3D格式转换工具HOOPS Exchange读取颜色和材料信息?

作为应用程序开发人员&#xff0c;非常希望导入部件的图形表示与它们在创作软件中的外观尽可能接近。外观可以在每个B-Rep面的基础上指定&#xff0c;而且&#xff0c;通过装配层次结构的特定路径可以在视觉外观上赋予父/子覆盖。HOOPS ExchangeHOOPS Exchange可捕获有关来自各…

亚信科技荣任「DBL电信行业工作组」副组长单位,AntDB数据库连年入选《中国数据库产品图谱》

日前&#xff0c;“2023可信数据库发展大会”在京圆满召开。亚信科技凭借自研的电信级核心交易数据库AntDB在通信行业15年的技术积累和行业贡献&#xff0c;成功当选为数据库应用创新实验室&#xff08;DBL&#xff09;电信行业工作组副组长单位。AntDB数据库连续两年入选《全球…