【Spring】Spring 创建和使用

Spring 创建和使用

  • 一. 创建 Spring 项目
    • 1. 创建⼀个 Maven 项目
    • 2. 添加 Spring 框架⽀持
    • 3. 添加启动类
  • 二. 存储 Bean 对象
    • 1. 创建 Bean
    • 2. 将 Bean 注册到容器
  • 三. 获取并使⽤ Bean 对象
    • 1. 创建 Spring 上下文
    • 2. 获取指定的 Bean 对象
    • 3. 使用 Bean

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

  • 将对象存储到容器(Spring)中;
  • 从容器中将对象取出来。

在Java 语⾔中对象也叫做 Bean。

一. 创建 Spring 项目

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

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

1. 创建⼀个 Maven 项目

在这里插入图片描述

2. 添加 Spring 框架⽀持

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

    <dependencies><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></dependencies>

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

3. 添加启动类

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

public class App {public static void main(String[] args) {}
}

二. 存储 Bean 对象

存储 Bean 分为以下 2 步:

  1. 存储 Bean 之前,先得有 Bean 才⾏,因此先要创建⼀个 Bean。
  2. 将创建的 Bean 注册到 Spring 容器中。
    具体实现如下。

1. 创建 Bean

Bean 就是 Java 语⾔中的⼀个普通对象

比如:

class User {public String sayHi(String name) {return name + " hello!";}
}

2. 将 Bean 注册到容器

在创建好的项⽬中添加 Spring 配置⽂件 spring-config.xml,将此⽂件放到 resources 的根⽬录下,
如下图所示:

在这里插入图片描述

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"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>

接下来,再将 User 对象注册到 Spring 中就可以,具体操作是在 中添加如下配置:

<beans><bean id="user" class="com.demo.example.User"></bean>
</beans>

这里面的 id 可以随便写,但是通常是将 类名的首字母的大写变为小写, 后面会根据这个 id 获取类,所以 id 不能重复, class 就是 类的位置。

三. 获取并使⽤ Bean 对象

获取并使⽤ Bean 对象,分为以下 3 步:

  1. 得到 Spring 上下⽂对象,因为对象都交给 Spring 管理了,所以获取对象要从 Spring 中获取,那么就得先得到 Spring 的上下⽂。
  2. 通过 Spring 上下⽂,获取某⼀个指定的 Bean 对象。
  3. 使⽤ Bean 对象。

1. 创建 Spring 上下文

Spring 上下⽂对象可使⽤ ApplicationContext,实现代码如下:

// 1.得到 Spring 的上下⽂对象,创建的时候需要配置 Spring 配置信息
ApplicationContext context = new ClassPathXmlApplicationContext("spring-con fig.xml"); // 配置文件的位置

除了 ApplicationContext 之外,我们还可以使⽤ BeanFactory 来作为 Spring 的上下⽂,如下代码所示:

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

ApplicationContext 和 BeanFactory 效果是⼀样的,ApplicationContext 属于 BeanFactory 的⼦类,它们的区别如下。

ApplicationContext VS BeanFactory(常⻅⾯试题):

  • 继承关系和功能⽅⾯来说:Spring 容器有两个顶级的接⼝:BeanFactory 和 ApplicationContext。其中 BeanFactory 提供了基础的访问容器的能⼒,⽽ ApplicationContext属于 BeanFactory 的⼦类,它除了继承了 BeanFactory 的所有功能之外,它还拥有独特的特性,还添加了对国际化⽀持、资源访问⽀持、以及事件传播等⽅⾯的⽀持。
  • 从性能⽅⾯来说:ApplicationContext 是⼀次性加载并初始化所有的 Bean 对象,所以后面去访问 Bean 时会很快。⽽ BeanFactory 是需要那个才去加载那个,因此 BeanFactory 更加轻量。

2. 获取指定的 Bean 对象

        // 2.加载某个 beanUser user1 = (User) context.getBean("user"); // 只根据 id 获取User user2 = context.getBean(User.class); // 只根据 类获取User user3 = context.getBean("user", User.class); // 同时根据 id 和 类获取,更推荐

注意事项: Bean 的 Id 要⼀⼀对应。
在这里插入图片描述

使用 类型获取和使用 id 获取 Bean 的区别:
当有⼀个类型被重复注册到 spring-config.xml 中时,只能使⽤根据名称获取了,⽐如以下程序:

在这里插入图片描述

在这里插入图片描述

而使用 类型获取就会报错:
在这里插入图片描述

3. 使用 Bean

public class App {public static void main(String[] args) {// 1.得到 Spring 上下⽂对象ApplicationContext context =new ClassPathXmlApplicationContext("spring-config.xml");// 2.加载某个 beanUser user = (User) context.getBean("user1");// 3.调⽤相应的⽅法System.out.println(user.sayHi("Java"));}
}

总的流程:

在这里插入图片描述

好啦! 以上就是对 Spring 创建和使用的讲解,希望能帮到你 !
评论区欢迎指正 !

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

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

相关文章

函数

章节目录&#xff1a; 一、定义一个函数1.1 相关概述1.2 句式规则 二、参数传递2.1 变量类型2.2 可变与不可变2.3 传不可变对象实例2.4 传可变对象实例 三、参数3.1 必需参数3.2 关键字参数3.3 默认参数3.4 不定长参数 四、匿名函数五、强制位置参数六、结束语 一、定义一个函数…

【vue3】wacth监听,监听ref定义的数据,监听reactive定义的数据,详解踩坑点

假期第二篇&#xff0c;对于基础的知识点&#xff0c;我感觉自己还是很薄弱的。 趁着假期&#xff0c;再去复习一遍 之前已经记录了一篇【vue3基础知识点-computed和watch】 今天在学习的过程中发现&#xff0c;之前记录的这一篇果然是很基础的&#xff0c;很多东西都讲的不够…

python复习

1.python属于解释型语言&#xff0c;解释器逐行解释每一句代码&#xff0c;然后执行 编译型语言需要由编译器生成最终可执行文件再执行 2. #单行注释""" 多行注释 """ 注释快捷键ctrl/ 3.变量是在计算机语言中能储存计算结果或表示某个数据…

Docker介绍与安装

目录 一、Docker 概述 1、什么时Docker 2、Docker的设计宗旨 4、Docker的优点 5、Docker容器和虚拟机的区别 6、 namespace的隔离&#xff08;命名空间&#xff09; 7、 Docker的三个核心概念 7.1 镜像 7.2 容器 7.3 仓库&#xff08;Docker Hapu&#xff09; 二、D…

Sentinel-2波段合成

Sentinel-2波段合成 在上一篇博客中下载了Sentinel-2数据&#xff0c;他有13个波段的.jp2文件&#xff0c;下面选取需要使用的波段进行合成。 导入了B2&#xff08;蓝色&#xff09;、B3&#xff08;绿色&#xff09;、B4&#xff08;红色&#xff09;、B8&#xff08;近红外&…

php实战案例记录(9)一行循环不使用花括号的写法

在 PHP 中&#xff0c;你可以将 foreach 循环写成一行&#xff0c;而不使用花括号 {}。这被称为“一行循环”&#xff08;Inline Loop&#xff09;。 下面是将 foreach ($_GET as $key > $value) 写成一行循环的示例&#xff1a; foreach ($_GET as $key > $value) ech…

Ubuntu下文件的解压缩操作:常用zip和unzip

Ubuntu下文件的解\压缩 压缩一个文件夹为zip包&#xff0c;加参数-r&#xff1a; zip -r MyWeb.zip MyWeb需要排除目录里某个文件夹&#xff1f;例如我要去掉node_modules&#xff0c;以显著减小压缩包体积&#xff0c;此时该怎么做&#xff1f; zip -r MyWeb.zip ./MyWeb…

Linux--网络编程-字节序

进程间的通信&#xff1a; 管道、消息队列、共享内存、信号、信号量。 特点&#xff1a;都依赖于linux内核。 缺陷&#xff1a;无法多机通信。 一、网络编程&#xff1a; 1、地址&#xff1a;基于网络&#xff0c;ip地址端口号。 端口号作用&#xff1a; 一台拥有ip地址的主机…

Windows11安装MySQL8.1

安装过程中遇到任何问题均可以参考(这个博客只是单纯升级个版本和简化流程) Windows安装MySQL8教程-CSDN博客 到官网下载mysql8数据库软件 MySQL :: Download MySQL Community Server 下载完后,解压到你需要安装的文件夹 其中的配置文件内容了如下 [mysqld]# 设置3306端口po…

(c++)类和对象 下篇

目录 1.再次了解构造函数 2. Static成员 3. 友元 4. 内部类 5.匿名对象 6.拷贝对象时的一些编译器优化 1.再次了解构造函数 1.1 构造函数体赋值 在创建对象时&#xff0c;编译器通过调用构造函数&#xff0c;给对象中各个成员变量一个合适的初始值。 class Date { pub…

从0开始python学习-26.selenium 强制等待、显示等待、隐式等待

目录 1. 强制等待&#xff1a;sleep() 2. 显示等待 3. 隐式等待 1. 强制等待 # 强制等待 from time import sleep sleep(3) 2. 显示等待 每隔一段时间不断地尝试查定位该元素如果定位到了该元素那么就返回该元素值 . 如果在规定的时间里面&#xff0c;没有找到&#xff0c…

前端和后端是Web开发选哪个好?

前端和后端是Web开发中的两个不同的领域&#xff0c;哪一种更适合学习&#xff1f;前景更广呢&#xff1f; 一、引言 Web前端开发就像装饰房间的小瓦匠&#xff0c;勤勤恳恳&#xff0c;仔仔细细&#xff0c;粉饰墙壁&#xff0c;妆点家具。会 HTML,CSS&#xff0c;懂点 JS。…

WARNING:tensorflow:Your input ran out of data; interrupting training. 解决方法

问题详情&#xff1a; WARNING:tensorflow:Your input ran out of data; interrupting training. Make sure that your dataset or generator can generate at least steps_per_epoch * epochs batches (in this case, 13800 batches). You may need to use the repeat() funct…

1.7.C++项目:仿muduo库实现并发服务器之Poller模块的设计

项目完整在&#xff1a; 文章目录 一、Poller模块&#xff1a;描述符IO事件监控模块二、提供的功能三、实现思想&#xff08;一&#xff09;功能&#xff08;二&#xff09;意义&#xff08;三&#xff09;功能设计 四、封装思想五、代码&#xff08;一&#xff09;框架&#…

Springboo整合Sentinel

Springboo整合Sentinel 1.启动Sentinel java -jar sentinel-dashboard-1.8.6.jar2.访问localhost:8080到Sentinel管理界面(默认账号和密码都是sentinel) 3.引入依赖(注意版本对应) <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spr…

IO学习系列之使用文件IO的接口在一个目录下,实现Linux命令“ls -l”的功能

实例要求&#xff1a;使用文件IO的接口在一个目录下&#xff0c;实现Linux命令“ls -l”的功能&#xff1b;实例分析&#xff1a;正常使用“ls -l”命令&#xff0c;会出现以下内容&#xff1a; /*- rwxrw-rw- 1 linux linux…

stm32 - 中断/定时器

stm32 - 中断/定时器 概念时钟树定时器类型基准时钟&#xff08;系统时钟&#xff09;预分频器 - 时基单元CNT计数器 - 时基单元自动重装寄存器 - 时基单元基本定时器结构通用定时器计数器模式内外时钟源选择 定时中断基本结构时序预分频器时序计数器时序 概念 时钟树 https:…

FFmpeg 多图片合成视频带字幕和音乐+特效(淡入淡出,圆圈黑色淡出)

FFmpeg 多图片合成视频带字幕和音乐+特效(淡入淡出,圆圈黑色淡出) 效果图1. 报错及解决2. xfade、xfade_opeccl 特效切换3. ffmpeg命令行详解4. 源码4.1 auto.bash4.2 geneFade.py4.3 python moviepy合并视频及音频按照(视频长度截取对应的音频在合并)4.4 命令行记录参考这…

微信小程序一对多个页面间传递数据进行通信,事件触发的实现方法

在有些场景下&#xff0c;使用组件间通信或者组件和页面间通信并不可行。比如我需要只有一个websocket实例&#xff0c;并且需要向多个页面传递我接收到的消息。 下面的方法是一个页面向其它页面&#xff08;触发事件&#xff09;传递数据&#xff0c;其它页面也可以向这个页面…

变量和数据类型代码练习

案例一 /*编程实现变量的输入输出*/ //导入java目录中util目录的Scanner类 import java.util.Scanner; public class VarIOTest {public static void main (String args [] ) {// 1.声明两个变量用于记录姓名和年龄信息&#xff08;局部变量需要默认值&#xff09;//Sting na…