Spring 的创建和使用

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

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

在 Java 语言中对象也叫做 Bean,所以后面咱们再遇到对象就以 Bean 著称


一、创建 Spring 项目

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

  • 创建⼀个普通 Maven 项目
  • 添加 Spring 框架支持(spring-context、spring-beans)
  • 添加启动类

1、先创建一个 maven 项目

在这里插入图片描述

在这里插入图片描述


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管理对象的模块

——如果一直不成功,可以配置国内的源:

设置 Settings & New Projects Settings 选中,配置文件 settings.xml

在这里插入图片描述

——导入成功:

在这里插入图片描述


3、创建一个启动类并添加 main

在创建好的项目 java 文件夹下创建一个启动类,包含 main 方法即可

public class App {public static void main(String[] args) {System.out.println("hello spring");}
}

二、存储 Bean 对象

存储 Bean 分为以下 2 (/3) 步:

  1. 如果是第一次添加,先在 spring 项目中添加配置文件,非第一次此步骤省略
  2. 存储 Bean 之前,先得有 Bean 才行,因此先要创建一个 Bean 对象
  3. 在配置文件中将需要将创建的 Bean 对象注册到 Spring 容器中

1、添加配置文件

在这里插入图片描述

创建 spring-config.xml 文件,代码:

<?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>

2、创建一个 Bean 对象

Bean 就是 Java 语言中的一个普通对象,创建 User 类,写一个 sayHi 方法,实现代码如下:

在这里插入图片描述


3、将 bean 通过配置文件注册到 spring 中

在创建好的项目中添加 Spring 配置文件 spring-config.xml,将此文件放到 resources 的根目录下:

PS: id 可以不等于 class 里面的类名的,但是要尽量符合规范
类名使用大驼峰,bean id 通常使用的是小驼峰。假设类名是 UserInfo,那么通常情况下 id 它应该是 userlnfo

在这里插入图片描述


三、从 spring 中将 bean 对象读取出来

1、先得到 spring 上下文对象

——使用 ApplicationContext

在这里插入图片描述


2、通过上下文对象提供 getBean() 获取需要使用的 bean 对象

在这里插入图片描述


3、使用 bean 对象【可选步骤】

使用 bean 对象 调用我们上面在 User 中写得 sayHi 方法,运行结果:hello: 张三!

在这里插入图片描述


四、注意问题

1、ApplicationContext VS BeanFactory

1.1、对比

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

在这里插入图片描述

ApplicationContextBeanFactory 效果是⼀样的,ApplicationContext 属于 BeanFactory 的子类,它们的区别如下:

ApplicationContext VS BeanFactory:(常见面试题)

——相同点:

  • 都可以实现从容器中获取 bean 对象,都提供了 getBean 方法

——不同点:

  • 继承关系和功能方面来说:
    • Spring 容器有两个顶级的接口:BeanFactoryApplicationContext
    • 其中 BeanFactory 只提供了基础的访问容器的能力 getBean() 方法,而 ApplicationContext 属于 BeanFactory 的子类,它除了继承了 BeanFactory 的所有功能之外,它还拥有独特的特性,还添加了对国际化支持、资源访问支、以及事件传播等方面的支持。
  • 从性能方面来说:ApplicationContext一次性加载并初始化所有的 Bean 对象,而 BeanFactory需要那个才去加载那个,因此更加轻量

1.2、验证

——创建 Article 类,代码如下:

package com.beans;public class Article {public Article() {System.out.println("加载了 Article");}public void sayHi() {System.out.println("hello Article");}
}

——修改 User 类,代码:

package com.beans;public class User {public User() {System.out.println("加载了 User");}public void sayHi(String name) {System.out.println("hello: " + name + "!");}
}

——将 Article 对象存储到容器中,在 spring-config.xml 中添加:

<bean id="article" class="com.beans.Article"></bean>
  • 使用 ApplicationContext 得到上下文对象:

证实 ApplicationContext 是一次性加载并初始化所有的 Bean 对象

在这里插入图片描述

  • 使用 BeanFactory 得到上下文对象:

运行程序,没有加载对象

在这里插入图片描述

BeanFactory 需要那个才去加载那个

在这里插入图片描述


4、getBean 方法的更多用法

1、使用 bean name 获取 bean

User user = (User) context.getBean("userInfo");

2、根据 bean type 获取 bean

User user = context.getBean(User.class);
  • 写法简单,但容易出问题。当同一个类型被注入到 spring 中多次(多个) 时候,就会报错。

在配置文件中加入这两条:

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

运行结果:

在这里插入图片描述

3、根据 bean name 和类型获取 bean

User user = context.getBean("user", User.class);

4、总结

  • 操作容器之前,先要有容器,所以先要得到容器

  • 存对象

    • 创建 Bean(普通类)
    • 将 Bean 注册(配置)到 spring-confing.xml 中
  • 取对象

    • 得到 Spring 上下文,并读取到 Spring 的配置文件
    • 获取某⼀个 Bean 对象
    • 使用 Bean 对象

操作流程如下图所示:

在这里插入图片描述


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

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

相关文章

STM32F405 串口6 485通信

1. 串口初始化函数 void USART6_init(u32 bound) {//GPIO端口设置USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO变量 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC|RCC_AH…

7.react useCallback与useMemo函数使用与常见问题

react useCallback与useMemo函数使用与常见问题 useCallback返回一个可记忆的函数&#xff0c;useMemo返回一个可记忆的值&#xff0c;useCallback只是useMemo的一种特殊形式。 那么这到底是什么意思呢&#xff1f;实际上我们在父子通信的时候&#xff0c;有可能传递的值是一…

实训笔记7.25

实训笔记7.25 7.25笔记一、MapReduce的特殊使用场景1.1 通过MapReduce程序实现多文件Join操作1.1.1 通过在Reduce端实现join操作1.1.2 通过在Map端实现join操作 1.2 MapReduce中的计数器的使用1.2.1 计数器使用两种方式 1.3 MapReduce实现数据清洗 二、MapReduce的OutputFormat…

Linux笔记——搜索命令find、解压缩命令、vi编辑器、用户权限命令、系统信息相关命令讲解

系列文章目录 Linux笔记——磁盘进行分区与挂载介绍 Linux笔记——管道相关命令以及shell编程 Linux笔记——进程管理与网络监控技术讲解​​​​​​ Linux笔记——rpm与yum下载软件命令介绍 文章目录 系列文章目录 准备工作 一 搜索命令—— find 搜索 1.1 目标 1.…

Python基础语法学习

文章目录 基础语法标识符注释行与缩进多行语句获取控制台输入print输出import 与 from...import 基本数据类型布尔类型数字类型字符串列表(List)元组(Tuple)集合(Set)字典(Dictionary) 数据类型转换隐式类型转换显式类型转换 条件控制if 语句match...case 循环语句whilewhile循…

html input 展示隐藏的密码

<!DOCTYPE html> <html> <meta http-equiv"Content-Type" content"text/html;charsetutf-8"/> <body><h2>登录表格</h2><form action"/action_page.php"><div class"container"><…

chrome查看浏览器内核日志

由于经常在网页上调试播放音视频&#xff0c;但是总遇到一些未知原因&#xff0c;导致无法正常播放&#xff0c;亟需查看浏览器内核日志&#xff0c;分析原因&#xff0c;做一下笔记。 (1) 查看浏览器快捷键属性 &#xff08;2&#xff09;在快捷键启动位置补充参数 --enable-…

菜鸡shader:L12 SD处理贴图制作时钟动画

文章目录 SD处理贴图Shader代码C#代码最后效果 SD处理贴图 呃呃感觉这节课&#xff0c;很大一部分都是在将怎么用SD来处理贴图&#xff0c;在这里就简单放一下课上的截图吧&#xff0c;我也跟着做了一下&#xff0c;虽然表盘十二个数排列间隔不一样&#xff0c;但还是稀碎地做…

脉冲频率、转速相关计算(信捷PLC C语言FC编程应用)

转速、线速度、角速度转换和计算关系请查看下面文章链接: 转速/线速度/角速度计算FC_RXXW_Dor的博客-CSDN博客里工业控制张力控制无处不在,也衍生出很多张力控制专用控制器,磁粉制动器等,本篇博客主要讨论PLC的张力控制相关应用和算法,关于绕线机的绕线算法,大家可以参看…

12.Netty源码之整体架构脉络

Netty 整体架构脉络 Netty 的逻辑处理架构为典型网络分层架构设计&#xff0c;共分为网络通信层、事件调度层、服务编排层&#xff0c;每一层各司其职。 网络通信层 网络通信层的职责是执行网络 I/O 的操作。它支持多种网络协议和 I/O 模型的连接操作。当网络数据读取到内核缓冲…

闲置旧手机搭建服务器?在安卓手机上使用Termux搭建web服务「公网远程访问」

文章目录 概述1.搭建apache2.安装cpolar内网穿透3.公网访问配置4.固定公网地址5.添加站点 概述 Termux是一个Android终端仿真应用程序&#xff0c;用于在 Android 手机上搭建一个完整的Linux 环境&#xff0c;能够实现Linux下的许多基本操作&#xff0c;不需要root权限Termux就…

docker系列5:docker安装nginx

传送门 前面介绍了docker的安装&#xff1a;docker系列1&#xff1a;docker安装 还有docker镜像加速器&#xff1a;docker系列2&#xff1a;阿里云镜像加速器 以及docker的基本操作&#xff1a; docker系列3&#xff1a;docker镜像基本命令 以及容器的基本命令&#xff1a;…

k8s服务发现之第五弹--使用 Service 连接到应用

Kubernetes 的网络模型 通过前面教程的学习&#xff0c;我们已经可以将容器化的应用程序在 Kubernetes 中运行起来&#xff0c;并且发布到 Kubernetes 内/外的网络上。 通常&#xff0c;Docker 使用一种 host-private 的联网方式&#xff0c;在此情况下&#xff0c;只有两个容…

Go学习 2、程序结构

2、程序结构 2.1 命名 一个名字必须以一个字母或下划线开头&#xff0c;后面可以跟任意数量的字母、数字或下划线。 大写字母和小写字母是不同的。 GO语言有25个关键字&#xff0c;关键字不能用于自定义名字。 还有大约30多个预定义名字&#xff0c;对应内建的常量、类型和函…

【iOS】多界面传值

文章目录 前言一、属性传值二、协议传值三、block传值四、KVO传值五、KVO的自动触发与手动触发六、通知传值总结 前言 在写网易云音乐以及3GShare包括后面的学生管理系统时&#xff0c;用到许多界面传值方法&#xff0c;特撰写博客记录目前学过的几种多界面传值方法 一、属性…

【Docker】Docker部署私有仓库的配置及应用

文章目录 一、Docker-registry 搭建本地私有仓库1. Registry 的概念2. Registry 的部署过程 二、Docker-harbor 搭建私有仓库1. 什么是Harbor2. Harbor 的特性3. Harbor的构成4. Harbor 的部署过程4.1 安装 harbor4.2 创建项目并进行上传下载4.3 上传镜像到私有仓库4.4 从私有仓…

Vue--插槽

一、插槽-默认插槽 1.作用 让组件内部的一些 结构 支持 自定义 2.需求 将需要多次显示的对话框,封装成一个组件 3.问题 组件的内容部分&#xff0c;不希望写死&#xff0c;希望能使用的时候自定义。怎么办 4.插槽的基本语法 组件内需要定制的结构部分&#xff0c;改用**…

mysql的主键选择

一.没有定义主键有什么问题 如果定义了主键&#xff0c;那么InnoDB会使用主键作为聚簇索引如果没有定义主键&#xff0c;那么会使用第一非空的唯一索引&#xff08;NOT NULL and UNIQUE INDEX&#xff09;作为聚簇索引如果既没有主键也找不到合适的非空索引&#xff0c;那么In…

【数据挖掘】时间序列的傅里叶变换:用numpy解释的快速卷积

一、说明 本篇告诉大家一个高级数学模型&#xff0c;即傅里叶模型的使用&#xff1b; 当今&#xff0c;傅里叶变换及其所有变体构成了我们现代世界的基础&#xff0c;为压缩、通信、图像处理等技术提供了动力。我们从根源上理解&#xff0c;从根本上应用&#xff0c;这是值得付…

STM32MP157驱动开发——按键驱动(线程化处理)

文章目录 “线程化处理”机制&#xff1a;内核函数线程化处理方式的按键驱动程序(stm32mp157)编程思路button_test.cgpio_key_drv.cMakefile修改设备树文件编译测试 “线程化处理”机制&#xff1a; 工作队列是在内核的线程的上下文中执行的 工作队列中有多个 work&#xff0…