【Spring 项目的创建和使用】

news2024/12/26 20:41:41

🎉🎉🎉点进来你就是我的人了
博主主页:🙈🙈🙈戳一戳,欢迎大佬指点!

欢迎志同道合的朋友一起加油喔🤺🤺🤺


目录

1. 创建 Spring 项目

2. 创建一个 普通 Maven 项目

3. 添加Spring框架支持

4. 添加启动类

5. 存储Bean对象

5.1 添加配置文件

5.2 创建Bean对象

5.3 注册Bean

6. 获取并使用Bean对象

1. 先获取Spring上下文对象

ApplicationContext 和 BeanFactory 的区别?(经典面试题)⭐⭐⭐

2. 获取 Bean(根据上下文对象提供的 getBean 方法)

(1) 通过 Bean id 来获取

(2) 通过类型来获取

(3) 通过 id + 类型来获取  (推荐写法)

7. 总结 Spring 的创建和使用



引言:

学习过上篇文章初识Spring后,我们知道Spring 就是⼀个包含了众多⼯具方法的 IoC 容器。它具备两个最核心的功能:将对象(Bean)存储到容器(Spring)中;从容器(Spring)中将对象(Bean)取出来。

1. 创建 Spring 项目

接下来使用Maven方式来创建一个Spring项目,创建Spring项目和Servlet类似,总共分为以下三步:

  1. 创建⼀个普通 Maven 项⽬
  2. 添加 Spring 框架⽀持(添加 spring-context 依赖 )
  3. 创建一个启动类并添加main(作用: 为后面从 Spring 容器中获取 bean 做准备)

2. 创建一个 普通 Maven 项目

依次点击File→New→Project,选择左侧的Maven项目,点击Next,然后填写项目名称,点击Finish,至此一个maven项目就创建好了,这里和前面servlet的创建maven项目是一样的,

不懂可以参考【Servlet 基础】,配置国内源可以参考【将maven源改为国内阿里云镜像】

创建好后配置一下国内源(就是常说的镜像Maven),这样的话就不会到国外仓库去下载依赖,他会在国内下载,下载更快而且不容易出错;如果我们是在国外仓库下载的话网不好就会很慢,而且还很容易出错(如果你有一次没下好,那么后面再下的时候,他就会以为你下过这个依赖了,就不下了,其实你下的依赖是残缺的,根本运行不了)

3. 添加Spring框架支持

大家可以去中央仓库拉取, 也可以直接复制下面代码粘贴到 Spring 项目中 pom.xml 下 <dependency></dependency> 标签中.

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

<dependencies>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.3.27</version>
    </dependency>

</dependencies>

【注意事项】

我们在添加完依赖时, 一定要切记点击 IDEA 右边 maven 的 Reload,  如果 IDEA 项目中出现下图中相关依赖信息, 则表示添加依赖成功了.

4. 添加启动类

在java文件夹下,创建一个启动类,包含main方法

5. 存储Bean对象

5.1 添加配置文件

第一次添加需要在项目中添加Spring配置文件 (只需要第一次添加即可)

resources目录下创建一个spring-config.xml(此文件名可以为别的,建议为spring-config)

<?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">
</beans>

 5.2 创建Bean对象

Bean对象就是Java中普通的对象,这里我们创建一个Student类

5.3 注册Bean

将创建好的Bean对象通过配置文件注册到Spring中

beans>
  <bean id="student" class="beans.Student"></bean>
</beans>

1. 一个这样的 bean 标签, 就表示我们要将一个 bean 对象托管到 Spring 中.

2. 此处的 id 就相当于寄快递时填写的电话号码, 因为我可能要托管多个 bean 对象到  Spring 中, 当我去获取对象的时候, 就需要根据这个 id 来取; 然后 class 就相当于是寄包裹时填写的地址. 

id : 标识, 取对象 (bean) 使用        class : 存储 bean 位置 (包名 + 类名 -> 定义到唯一对象)

3. id 的名字可以随便取, 此处是为了词达意, 你取zhangsan, lisi 都没关系, 只是合法不合理.

经过以上操作, 我的 bean 对象是否已经存储到 Spring 中了呢 ?

其实并没有, 上述操作只是声明了我要存储对象到 Spring 当中. 当程序正儿八经的执行的时候, Spring 采用的是懒加载(单例模式中的懒汉模式), 在启动 Spring 项目的时候, 它不会立即的去将 bean 存储到 Spring 中, 这是它实现上的一个策略, 这也是广义上和狭义上的一个区别, 就类似于并发和并行两者之间的区别一样, 初学的时候, 站在广义的角度上便于理解.

6. 获取并使用Bean对象

使用Spring上下文的方式获取Bean对象

  1. 先获取Spring上下文对象
  2. 再通过上下文对象提供的方法获取指定的Bean对象

1. 先获取Spring上下文对象

public class App {
    public static void main(String[] args) {
        //1,得到Spring
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        //2.从spring容器中获取 Bean 对象 ,此处的"student" 必须和spring-config.xml配置中的Bean的id保持一致
        //getBean的返回类型为Object,所以强转一下
        Student student =(Student) context.getBean("student"); //该行代码就是实现IOC思想的DI操作
        //3.使用Bean对象(非必须,也可以获取不用)
        student.sayHi();
    }
}

 除了这种方法可以拿到 Spring 上下文对象之外, 我们还可以使用 BeanFactory 来作为 Spring 上下文对象. 使用 ApplicationContext 或者 BeanFactory 来获取 Spring 上下文对象, 是同样的效果, 只不过 ApplicaitonContext 是 BeanFactory 的一个子类.

BeanFactory beanFactory =            
    new XmlBeanFactory(new ClassPathResource("spring-config.xml"));

ApplicationContext 和 BeanFactory 的区别?(经典面试题)⭐⭐⭐

相同点: 都可以实现从容器中获取bean,都提供了getBean的方法。
不同点:

  1. ApplicationContext属于BeanFactory的子类。BeanFactory只提供了基础访问Bean的方法,
    ApplicationContext除了拥有BeanFactory的所有功能之外,还提供了更的方法实现,比如对国际化的支持、资源访问的支持、以及事件和传播等方面的支持。
  2. 从性能方面来说二者是不同,BeanFactory 是按需加载Bean(懒汉方式), ApplicationContext 是饿汉方式,在创建时会将所有的Bean都加载起来,以备以后使用。

2. 获取 Bean(根据上下文对象提供的 getBean 方法)

(1) 通过 Bean id 来获取

//根据上下文提供的方法获取bean对象
Student student =(Student) context.getBean("student"); 

(2) 通过类型来获取

//通过类型获取bean对象
Student student =context.getBean(Student.class);

虽然写法简单,但是容易出问题,当同一个类型被注入 Spring 中多次(多个)的时候,就会报错

(3) 通过 id + 类型来获取  (推荐写法)

这种是最安全的写法,不会出现像上面那种情况,但是id要对应上😊

//通过id+类型获取bean对象
Student student =context.getBean("student",Student.class);

此种方式是为了解决使用class获取bean时存在多个相同类型的bean对象,此时加上id(因为id的唯一性)就可以获取唯一的bean对象,当相同的类多次注入到spring容器中时,此时多个相同类型的bean对象各不相同(每个bean都有其唯一的地址)

7. 总结 Spring 的创建和使用

1. 创建 Spring 项目, 相当于得到容器.

  • 创建⼀个普通 Maven 项⽬
  • 添加 Spring 框架⽀持(添加 spring-context 依赖 )
  • 创建一个启动类并添加main(作用: 为后面从 Spring 容器中获取 bean 做准备)

2. 存储 bean 对象

  • 创建 bean
  • 将 bean 对象注册到 Spring 配置文件中 (spring-config.xml)

3. 读取 bean 对象

  • 拿到 Spring 上下文 对象 
  • 通过 Spring 对象 getBean 方法 获取到 bean 对象 【 DI 操作】
  • 使用 bean 对象 (非必须)

基本流程图: 

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

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

相关文章

chatgpt赋能python:Python如何更新pip

Python 如何更新 pip 在 Python 编程中&#xff0c;pip 是一个非常重要的工具&#xff0c;它可以帮助我们安装和管理 Python 包。然而&#xff0c;我们有时候会遇到 pip 版本过低&#xff0c;需要进行更新的情况。那么&#xff0c;如何更新 pip 呢&#xff1f; 什么是 pip p…

论文笔记(三十):Counter-Hypothetical Particle Filters for Single Object Pose Tracking

Counter-Hypothetical Particle Filters for Single Object Pose Tracking 文章概括摘要1. 简介II. 相关工作A. 机器人的物体姿态估计和跟踪B. 鲁棒性的粒子滤波 III. 背景&#xff1a;粒子滤波A. 粒子滤波B. 粒子剥夺和粒子重振IV. 反假设粒子滤波A. 反假设重取样B. 6D姿势估计…

记一次为学校流浪猫开发的小程序——航海之猫

某次刷朋友圈时&#xff0c;看到校园墙上有一个校园流浪猫救助组织在召集爱心人士加入工作小组。其中需要会做微信小程序的给学校里的猫猫做一个猫猫图鉴&#xff0c;于是就有了本次项目经历。 相关技术及工具 工具&#xff1a;Uniapp、XBuilder、微信官方开发者工具技术&…

chatgpt赋能python:Python如何把文件复制到另一个目录下

Python如何把文件复制到另一个目录下 作为一个有着10年Python编程经验的工程师&#xff0c;我可以告诉你&#xff0c;在Python编程中&#xff0c;复制文件是非常常见的任务之一。无论您是为了备份数据或将文件从一个地方传输到另一个地方&#xff0c;都需要使用文件复制操作。…

Linux中/dev/null和/dev/zero的作用

1./dev/null和/dev/zero介绍 在Linux环境中&#xff0c;我们会经常用到/dev/null和/dev/zero&#xff0c;今天为大家讲讲/dev/null和/dev/zero的作用以及使用场景。 1.1./dev/null介绍 linux中/dev/null&#xff0c;它是一种特殊的虚拟设备&#xff0c;用于写入而不是读取&a…

前端050_单点登录SSO_登录功能实现

登录功能实现 1、登录认证流程2、定义 Api 调用登录接口3、Vuex 登录信息状态管理4、提交登录触发 action5、测试1、登录认证流程 单点登录认证流程图 门户客户端要求登录时,输入用户名密码,认证客户端提交数据给认证服务器认证服务器校验用户名密码是否合法,合法响应用户…

RISC-V学习基础(六)

原子指令 RV32A有两种类型的原子操作&#xff1a; 内存原子操作&#xff08;AMO&#xff09;加载保留/条件存储&#xff08;load reserved/store conditional&#xff09; 图6.1是RV32A扩展指令集的示意图&#xff1a; 图6.2列出了它们的操作码和指令格式 AMO&#xff08;at…

chatgpt赋能python:Python如何更新包

Python如何更新包 Python是当今最流行的编程语言之一&#xff0c;它通过其丰富的生态系统和充足的工具库为许多开发者提供了便捷、快速、高效的开发体验。在Python的世界里&#xff0c;包是一种最重要的组件之一&#xff0c;因为它们可以让你轻松地扩展Python的功能&#xff0…

【跨域】如何解决跨域问题

同源策略 同源 相同协议相同域名相同端口 内容 浏览器的同源策略 - Web 安全 | MDN (mozilla.org) 浏览器页面向不同源的服务器发送ajax请求资源时&#xff0c;响应的数据会被浏览器拦截 意义 出于安全性的考虑&#xff0c;防止恶意获取数据 解决方案 JSONP 不使用aj…

Rust每日一练(Leetday0022) 最小路径和、有效数字、加一

目录 64. 最小路径和 Minimum Path Sum &#x1f31f;&#x1f31f; 65. 有效数字 Valid Number &#x1f31f;&#x1f31f;&#x1f31f; 66. 加一 Plus One &#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练 专栏 Golang每日一练 专栏 P…

docker水位如何清理(容器水位清理详细分析)

docker水位过高&#xff0c;清理怕出问题&#xff1f;&#xff0c;不知道清理什么&#xff1f;怕删错了&#xff1f;进入实践 第一步准备测试数据 创建 悬空的镜像&#xff08;即REPOSITORY和TAG均为的镜像&#xff09; docker pull busybox:musl docker tag busybox:musl b…

chatgpt赋能python:Python的更新:为什么你需要及时更新并如何更新

Python的更新&#xff1a;为什么你需要及时更新并如何更新 Python是一种强大的程序设计语言&#xff0c;它具有广泛的应用&#xff0c;从数据科学&#xff0c;机器学习到Web开发&#xff0c;都有着广泛的应用。不断更新的Python版本为开发者和用户提供了最新的功能和最佳实践。…

chatgpt赋能python:Python如何在同一行输出

Python如何在同一行输出 Python是一种高级编程语言&#xff0c;广泛应用于数据科学、Web开发、人工智能等领域。其中&#xff0c;输出内容是程序必不可少的一部分。本文将介绍在Python中如何在同一行输出多个内容。 一般输出 在Python中&#xff0c;使用print函数可以将内容…

Lecture 9 Lexical Semantics

目录 Introduction: sentiment analysis 引言&#xff1a;情感分析Word Semantics 单词语义Word meanings 单词含义WordNetSynsets 同义词集Noun Relations in WordNetHypernymy Chain 上位链Word SimilarityWord Similarity with PathsBeyond Path LengthAbstract NodesConcep…

GO 性能分析

GO 性能分析 简介 ​ go提供了内存分析工具&#xff0c;pprof利用它可以看cpu和内存的情况。 包含下面的几种类型&#xff1a; cpu内存阻塞锁 pprof分为大体分为两个部分 数据采集数据分析 数据采集有两种方式&#xff1a; 官方 官方提供了两种方式 runtime/pprof 这是用…

【AI】惠普暗夜精灵9安装Ubuntu20.04+nvidia驱动

1、关闭快速启动 NVIDIA驱动安装很是矫情,为了谨慎起见,还是禁用快速启动吧 在Win11下,进入控制面板–》硬件和声音–》电源选项–》更改电源按钮的功能 禁止“启用快速启动” 2、关闭设备加密 关闭设备加密,否则安装过程中会报:bitlocker加密需要解除 3、设置bios…

SpringMVC《学习笔记(21版尚硅谷)》

一、SpringMVC简介 1、什么是MVC MVC是一种软件架构的思想&#xff0c;将软件按照模型、视图、控制器来划分 M&#xff1a;Model&#xff0c;模型层&#xff0c;指工程中的JavaBean&#xff0c;作用是处理数据 JavaBean分为两类&#xff1a; 一类称为实体类Bean&#xff1…

Form表单(antd-design组件库)简单使用以及单一检查规则

1.Form表单 高性能表单控件&#xff0c;自带数据域管理。包含数据录入、校验以及对应样式。 2.何时使用 用于创建一个实体或收集信息。 需要对输入的数据类型进行校验时。 组件代码来自&#xff1a; 表单 Form - Ant Design 3.本地验证前的准备 参考文章【react项目antd组件-de…

chatgpt赋能python:Python如何变大字体的SEO技巧

Python如何变大字体的SEO技巧 在网页设计和优化中&#xff0c;使用合适的字体和字体大小是至关重要的。对于使用Python编程的开发人员和网站管理员来说&#xff0c;如何使Pyhton代码中的字体变大是一个非常有用的技巧。在本文中&#xff0c;我们将介绍几种方法来增大Python代码…

C语言7:输入若干个学生的成绩,统计出平均成绩

在程序编辑区编写程序&#xff0c;给定程序功能是: 从键盘上输入若干个学生的成绩&#xff0c;统计出平均成绩&#xff0c;并输出低于平均分的学生成绩&#xff0c;用输入负数结束输入。 例如输入: 70 80 90 -1 输出: ave 80.00 --------OUTPUT----------- 70.0 程序有…