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

news2024/11/25 10:29:23

目录

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.coloradmin.cn/o/770634.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

谈一谈,Spring Boot 中的 starter 到底是什么 ?

1. 为什么要用Starter? 现在我们就来回忆一下&#xff0c;在还没有Spring-boot框架的时候&#xff0c;我们使用Spring 开发项目&#xff0c;如果需要某一个框架&#xff0c;例如mybatis&#xff0c;我们的步骤一般都是&#xff1a;到maven仓库去找需要引入的mybatis jar包&am…

【UE5 多人联机教程】01-创建主界面

目录 工程地址 步骤 参考链接 工程地址 GitHub - UE4-Maple/C_MP_Lobby: 多人大厅教程项目 步骤 1. 先新建一个工程 2. 将下载的工程中的Plugins目录拷贝到自己新建的工程下 3. 打开工程&#xff0c;新建一个游戏实例 这里命名为“GI_Main” 在项目设置中设置游戏实例类为…

排序算法之快速排序举例详解-python实现3版代码及改进过程

快速排序思想步骤&#xff1a; 1.找到一个基准值key 2.设置2个元素下标i0和jlen-1 3.从后往前找到比key小的数num[j]&#xff0c;从前往后找到比key大的数num[i]&#xff08;这里有个先后顺序&#xff09; 4.交换这两个数&#xff1a;num[i]&#xff0c;num[j] 5.继续重复…

如何在PADS Logic中查找器件

PADS Logic提供类似于Windows的查找功能&#xff0c;可以进行器件的查找。 &#xff08;1&#xff09;在Logic设计界面中&#xff0c;将菜单显示中的“选择工具栏”进行打开&#xff0c;如图1所示&#xff0c;会弹出对应的“选择工具栏”的分栏菜单选项&#xff0c;如图2所示。…

数据库信息速递 MONGODB 6.0 的新特性,更多的查询函数,加密查询,与时序数据集合 (译)...

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到3群&#xff08;共…

Shell脚本函数 实验

Shell 函数 命令序列按照格式写在一起&#xff0c;用函数的方式调用并进行重复使用命令序列。这就是它的核心作用 使用函数可以避免代码重复&#xff0c;函数可以将大的工程分割成若干小的功能模块&#xff0c;提高代码的可读性。 函数的基本格式写法有两种&#xff0c;如下&…

零钱兑换 II(力扣)动态规划 JAVA

给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带符号整数。 示例…

预付费电表收费系统

预付费电表收费系统是一种先进的电表管理系统&#xff0c;它能够帮助电力公司更加高效地管理电表收费&#xff0c;提高用电效率&#xff0c;降低能源浪费。本文将从以下几个方面介绍预付费电表收费系统的特点和优势。 一、预付费电表收费系统的原理 预付费电表收费系统是指用户…

5分钟给你破解这套10万赞的生产教程,访谈乔布斯的AI对话数字人视频是怎么做的

本期是赤辰第16期AI项目拆解栏目&#xff1b; 底部准备了7月粉丝福利&#xff0c;看完可以领取&#xff1b; 上周给粉丝们讲解AI动图说话月涨粉20万的案例并给出保姆式教程&#xff0c;粉丝反馈很热烈&#xff0c;都觉得AI强大&#xff0c;有些学员给自己账号做视频&#xff…

ACME申请SSL证书

1.开放443端口 firewall-cmd --permanent --add-port443/tcp # 开放443端口 firewall-cmd --reload # 重启防火墙(修改配置后要重启防火墙)2.安装ACME # 安装acme curl https://get.acme.sh | sh -s email你的邮箱地址 # 别名 alias acme.sh~/.acme.sh/acme.sh3.使用ACME申请…

rabbitMQ杂记

消息队列应用场景 消息队列中间件是分布式系统中重要的组件&#xff0c;主要解决应用耦合&#xff0c;异步消息&#xff0c;流量 削锋等问题实现高性能&#xff0c;高可用&#xff0c;可伸缩和最终一致性&#xff1a; 解耦&#xff1a; 异步&#xff1a; 削峰&#xff1a; 常…

全面深入理解MySQL自增锁

&#x1f497;推荐阅读文章&#x1f497; &#x1f338;JavaSE系列&#x1f338;&#x1f449;1️⃣《JavaSE系列教程》&#x1f33a;MySQL系列&#x1f33a;&#x1f449;2️⃣《MySQL系列教程》&#x1f340;JavaWeb系列&#x1f340;&#x1f449;3️⃣《JavaWeb系列教程》…

Gin+Gorm练手小项目bubble清单企业级结构剖析

概述 本项目来源于Qimi老师的小清单项目——基于gingorm开发的练手小项目&#xff0c;通过该项目可初识go web开发该有的姿势。笔者对代码有些许修改&#xff0c;以下是项目成功运行的截图&#xff0c;主要功能有添加&#xff0c;删除&#xff0c;确认&#xff0c;查看待办事项…

APP测试学习之Android模拟器Genymotion安装配置不上解决方法以及adb基本使用

Android模拟器Genymotion安装配置不上解决方法以及adb基本使用 Genymotion下载安装配置遇见的问题解决方法adb基本使用 Genymotion下载 1.首先进入官网 https://www.genymotion.com/ 2.在官网注册一个账号 https://www-v1.genymotion.com/account/login/ 3.下载 https://www.g…

Linux之设备树解耦架构解读-V1.0

术语和缩略语 本文档使用了以下术语和缩略语 Dts&#xff1a;DTS即Device Tree Source&#xff0c;是一个文本形式的文件&#xff0c;用于描述硬件信息。一般都是固定信息&#xff0c;无法变更&#xff0c;无法overlay。 Dtsi&#xff1a;可以理解为dts的公共部分&#xff0…

【编程技巧--函数指针回调函数】

1&#xff0e;什么是函数指针 在C语言中&#xff0c;一个函数在编译时被分配一个入口地址(第一条指令的地址),我们可以将地址赋给一个指针,这样,指针变量持有函数入口地址,它就指向了该函数,所以称这种指针为指向函数的指针,简称函数指针。 我们在编写代码的时候可以用函数名…

教你快速安装Bootstrap

目录 Bootstrap简介Bootstrap的下载Bootstrap的使用 Bootstrap简介 Bootstrap是美国Twitter公司的设计师Mark Otto和Jacob Thornton合作&#xff0c;基于HTML、CSS、JavaScript开发的简洁、直观、强悍的前端开发框架&#xff0c;它会使Web开发更加快捷Bootstrap框架的优点 开发…

【电路原理学习笔记】第4章:能量与功率:4.3 电阻的额定功率

第4章&#xff1a;能量与功率 4.3 电阻的额定功率 额定功率是一个电阻器可以消耗的最大功率&#xff0c;且保证其不会被过多的热量损坏或改变其阻值。额定功率与电阻值无关&#xff0c;主要由电阻的材料成分、物理尺寸和形状决定。在其他条件相同的情况下&#xff0c;电阻的表…

Redis分布式锁的演变历程

什么时候用分布式锁 当并发去读写一个【共享资源】的时候&#xff0c;我们为了保证数据的正确&#xff0c;需要控制同一时刻只有一个线程访问。 分布式锁就是用来控制同一时刻&#xff0c;只有一个 JVM 进程中的一个线程可以访问被保护的资源。 分布式锁入门 分布式锁应该满足…

MySQL数据库之高级SQL语句

目录 一.MySQL语句前言 1.1 按关键字排序 1.2 环境准备 1.3单字段排序 1.3.1升序 1.3.2降序 1.3.3 order by还可以结合where进行条件过滤 ​编辑 1.4多字段排序 1.4.1查询学生信息先按兴趣id升序排列&#xff0c;相同分数的&#xff0c;id按照降序排列 1.4.2查询学生信息先…