当前位置: 首页 > news >正文

【Spring】(二)从零开始的 Spring 项目搭建与使用

文章目录

  • 前言
  • 一、Spring 项目的创建
    • 1.1 创建 Maven 项目
    • 1.2 添加 Spring 框架支持
    • 1.3 添加启动类
  • 二、储存 Bean 对象
    • 2.1 创建 Bean
    • 2.1 将 Bean 注册到 Spring 容器
  • 三、获取并使用 Bean 对象
    • 3.1 获取Spring 上下文
    • 3.2 ApplicationContext 和 BeanFactory 的区别
    • 3.3 获取指定的 Bean 对象
  • 四、总结


前言

通过前面的文章我们知道了,Spring 其实就是一个包含了众多工具的 IoC 容器。既然是容器那么主要就涉及到两个操作,即:

  • 将对象储存到 Spring 容器中
  • 使用的使用将对象从 Spring 容器中取出

因此,学习 Spring 容器,主要就是学习它的存取操作。下文详细介绍了 Spring 项目的创建与使用。

一、Spring 项目的创建

下文将以 Maven 的方式来创建一个 Spring 项目,创建 Spring 项目的方式与 Servlet 类似,主要分为以下三步骤:

  1. 创建 Maven 项目;
  2. 添加 Spring 框架支持;
  3. 添加启动类。

以下就是围绕这三个步骤来创建 Spring 项目的具体过程。

1.1 创建 Maven 项目


创建好后其目录结构如下:

1.2 添加 Spring 框架支持

  1. 在 Maven 中央仓库搜索 Spring,选择 “Spring Context”:
  2. 选择 5.xxxx版本

  1. 选择 Maven,然后将其复制粘贴到 pom.xml 文件中


最后的 pom.xml文件样式如下:

1.3 添加启动类

即在 Java 目录下创建一个类,其中包含一个 main 方法即为启动类:

二、储存 Bean 对象

什么是 Bean:

在 Spring 框架中,Bean 是一个非常重要的概念,它是Spring容器中被管理和维护的对象。Bean 可以是任何的Java对象,例如 POJO(Plain Old Java Object)、实体类、服务类等。这些对象在 Spring 容器中被实例化、组装、管理和销毁,以提供各种功能和服务

储存 Bean 分为两个步骤:

  1. 先创建 Bean 类;
  2. 然后将创建的 Bean 注册到 Spring 容器中。

2.1 创建 Bean

此处以一个 Student 类为例:

public class Student {public Student(){System.out.println("init student");}public void sayHi(){System.out.println("Hi, I am a student.");}
}

2.1 将 Bean 注册到 Spring 容器

要想将 Bean 对象注册到 Spring 容器中,首先需要在 resources 目录下创建一个配置文件,一般取名为 spring-config.xml

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

然后将 Student 对象注册到 Spring 中,即在 <beans>添加以下配置:

其中 id 字段表示给 Bean 取的名,class 字段则是 包名 + 类名

三、获取并使用 Bean 对象

获取并使用 Bean 对象也大致可分为以下三步:

  1. 获取 Spring 上下文对象,因为对象都交给 Spring 管理了,所有要获取 Spring 中的 Bean,首先就需要获取 Spring;
  2. 通过回去的 Spring 上下文对象,获取指定的 Bean 对象;
  3. 使用 Bean 对象。

3.1 获取Spring 上下文

获取 Spring 上下文对象的方式主要有两个,即使用ApplicationContextBeanFactory来获取。

1. 使用ApplicationContext获取

    public static void main(String[] args) {ApplicationContext context =new ClassPathXmlApplicationContext("spring-config.xml");}

2. 使用BeanFactory获取

    public static void main(String[] args) {BeanFactory beanFactory =new XmlBeanFactory(new ClassPathResource("spring-config.xml"));}

3.2 ApplicationContext 和 BeanFactory 的区别

此时,分别执行 ApplicationContextBeanFactory 获取 Spring 上下文对象的 main方法:

ApplicationContext


此时,可以发现当使用 ApplicationContext获取 Spring 上下文的时候,会立即初始化 Spring 容器中的 Bean 对象。

BeanFactory


当使用BeanFactory 获取 Spring 上下文的时候,并没有立即初始化 Spring 中的 Bean 对象,而是在获取 Bean 对象的时候才初始化,即是一种懒加载模式。

ApplicationContextBeanFactory之间的区别可总结如下:

继承关系和功能层面:

  • ApplicationContext 接口继承了 BeanFactory 接口,其中 BeanFactory 提供了基础的访问容器的能力,而 ApplicationContext 除了继承 BeanFactory的所有功能之外,还拥有独特的功能,比如添加了对国际化的支持、资源的访问支持、事件传播等方面的支持。

性能方面:

  • ApplicationContext 是⼀次性加载并初始化所有的 Bean 对象,而 BeanFactory 是需要哪个 Bean 对象的时候才会去加载,因此更加轻量。
  • 因此当性能要求较高而内存充足的场景下推荐使用 ApplicationContext;而在内存空间较小,对性能要求不高的场景下推荐使用BeanFactory

3.3 获取指定的 Bean 对象

  1. 直接通过 Bean 对象的名称获取
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
Student student = (Student) context.getBean("student");

getBean方法直接通过 Bean 对象的名称获取返回的是一个 Object 对象,因此需要强制类型转换。

  1. 通过 Bean 的类型获取
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
Student student = context.getBean(Student.class);

getBean方法通过 Bean 对象的类型获取,此时不需要进行强制类型转换,但是这种方法存在一个问题:如果当 Spring 容器中存在多个相同类型的 Bean 对象的时候就会出现歧义,即找不到返回哪个对象

比如在 Spring 容器中再添加一个 Student 对象:

此时启动 main 函数的时候,就会出现如下问题:


此时,Spring 容器中存在两个相同类型的 Bean 对象,而通过类型获取的话,就不知道获取哪一个了。因此要解决这个问题就可以采用 通过 Bean 名称 + 类型获取

  1. 通过 Bean 名称 + 类型获取
    public static void main(String[] args) {ApplicationContext context =new ClassPathXmlApplicationContext("spring-config.xml");Student student = context.getBean("student", Student.class);Student student2 = context.getBean("student2", Student.class);student.sayHi();student2.sayHi();}

此时,通过 Bean 名称 + 类型获取的方式,即使是 Spring 容器中存在多个相同类型的 Bean 对象,但由于其名称不同,也能够正确获取到指定的 Bean 对象。

四、总结

以上详细介绍了 Spring 项目的创建和使用过程,下面是对其整个流程的总结。

  1. 通过 Maven 项目创建 Spring 项目,并且还要添加对 Spring 框架的支持;
  2. 创建 Bean 对象,然后通过 spring-config.xml 配置文件将其储存到 Spring 容器中;
  3. 获取 Bean 对象:
    • 首先通过 ApplicationContext 或者 BeanFactory 获取配置文件,即获取 Spring 上下文对象。
    • 通过 getBean 方法获取 Bean 对象。
    • 使用 Bean 对象。

相关文章:

【Spring】(二)从零开始的 Spring 项目搭建与使用

文章目录 前言一、Spring 项目的创建1.1 创建 Maven 项目1.2 添加 Spring 框架支持1.3 添加启动类 二、储存 Bean 对象2.1 创建 Bean2.1 将 Bean 注册到 Spring 容器 三、获取并使用 Bean 对象3.1 获取Spring 上下文3.2 ApplicationContext 和 BeanFactory 的区别3.3 获取指定的…...

redis五种数据类型介绍

、string&#xff08;字符串&#xff09; 它师最基本的类型&#xff0c;可以理解为Memcached一模一样的类型&#xff0c;一个key对应一个value。 注意&#xff1a;一个键最大能存储 512MB。 特性&#xff1a;可以包含任何数据,比如jpg图片或者序列化的对象,一个键最大能存储512…...

【JavaEE】Spring Boot - 项目的创建和使用

【JavaEE】Spring Boot 开发要点总结&#xff08;1&#xff09; 文章目录 【JavaEE】Spring Boot 开发要点总结&#xff08;1&#xff09;1. Spring Boot 的优点2. Spring Boot 项目创建2.1 下载安装插件2.2 创建项目过程2.3 加载项目2.4 启动项目2.5 删除一些没用的文件 3. Sp…...

Git reset、revert用法

reset reset是删除之前的提交记录&#xff0c;所有的提交点都会被清除&#xff0c;我们看下执行前后的git log区别 D:\workspace\android>git log commit 87c1277a57544c53c603b04110e3dde100da8f57 (HEAD -> develop_main) Author: test <test.com> Date: Wed…...

Redis-1

Redis 理论部分 redis 速度快的原因 1、纯内存操作 2、单线程操作&#xff0c;避免了频繁的上下文切换和资源争用问题&#xff0c;多线程需要占用更多的 CPU 资源 3、采用了非阻塞 I/O 多路复用机制 4、提供了非常高效的数据结构&#xff0c;例如双向链表、压缩页表和跳跃…...

【Linux】Linux服务器连接百度网盘:实现上传下载

【Linux】Linux服务器连接百度网盘&#xff1a;实现上传下载 文章目录 【Linux】Linux服务器连接百度网盘&#xff1a;实现上传下载1. 前言2. 具体过程2.1 pip 安装所需包2.2 认证&#xff08;第一次连接需要认证&#xff09;2.3 下载所需文件或者目录2.4 其他指令使用2.5 注意…...

ADC模拟看门狗

如果被ADC转换的模拟电压低于低阀值或高于高阀值&#xff0c;AWD模拟看门狗状态位被设置。阀值位 于ADC_HTR和ADC_LTR寄存器的最低12个有效位中。通过设置ADC_CR1寄存器的AWDIE位 以允许产生相应中断。通过以下函数可以进行配置 void ADC_AnalogWatchdogCmd(ADC_TypeDef* ADCx…...

google谷歌gmail邮箱账号注册手机号无法进行验证怎么办?此电话号码无法用于进行验证 或 此电话号码验证次数太多

谷歌gmail邮箱账号注册手机号无法进行验证怎么办? 使用手机号码注册谷歌gmail邮箱账号时会遇到&#xff1a;此电话号码无法用于进行验证 或 此电话号码验证次数太多。造成注册google谷歌gmail邮箱账号受阻&#xff0c;无法正常完成注册。 谷歌Gmail邮箱账号正确的注册方法与教…...

Spring:IOC技术、Bean、DI

前言 Spring是一个开源的项目&#xff0c;并不是单单的一个技术&#xff0c;发展至今已形成一种开发生态圈。也就是说我们可以完全使用Spring技术完成整个项目的构建、设计与开发。Spring是一个基于IOC和AOP的架构多层j2ee系统的架构。 SpringFramework&#xff1a;Spring框架…...

目标检测与跟踪 (2)- YOLO V8配置与测试

系列文章目录 第一章 目标检测与跟踪 &#xff08;1&#xff09;- 机器人视觉与YOLO V8 目标检测与跟踪 &#xff08;1&#xff09;- 机器人视觉与YOLO V8_Techblog of HaoWANG的博客-CSDN博客3D物体实时检测、三维目标识别、6D位姿估计一直是机器人视觉领域的核心研究课题&a…...

【Leetcode】56.合并区间

一、题目 1、题目描述 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [ s t a r t i start_i start...

设置系统编码 Beta

在yolov5环境搭建过程中会遇到如下的编码错误警告&#xff1a; 这时&#xff0c;按住“ctrlc”中止进程&#xff0c;然后设置系统编码&#xff1a; 电脑右键属性打开&#xff1a; 重启之后等安装好了&#xff0c;记得回去把bae键取消。...

phpunit

composer地址&#xff1a;phpunit/phpunit - Packagist 官方文档:PHPUnit文档 – PHP测试框架 PHPUnit是一个框架&#xff0c;最为hyperf学习的补充学习&#xff0c;就不写这么细了。 估计写下安装和使用&#xff0c;具体学习内容看文档。 一、安装 需安装扩展&#xff1a;…...

html学习9(脚本)

1、<script>标签用于定义客户端脚本&#xff0c;比如JavaScript&#xff0c;既可包含脚本语句&#xff0c;也可通过src属性指向外部文件。 2、JavaScript最常用于图片操作、表单验证及内容动图更新。 3、<noscript>标签用于在浏览器禁用脚本或浏览器不支持脚本&a…...

SpringBoot整合Caffeine

一、Caffeine介绍 1、缓存介绍 缓存(Cache)在代码世界中无处不在。从底层的CPU多级缓存&#xff0c;到客户端的页面缓存&#xff0c;处处都存在着缓存的身影。缓存从本质上来说&#xff0c;是一种空间换时间的手段&#xff0c;通过对数据进行一定的空间安排&#xff0c;使得下…...

元宇宙虚拟展厅的特点是什么呢?优势有哪些?

元宇宙是一个很广阔的虚拟世界&#xff0c;它可以创造出更为丰富、沉浸式的体验&#xff0c;这种全新的体验为展览和艺术领域带来了更多的可能性&#xff0c;元宇宙虚拟展厅以其多样化、互动性、沉浸式展示的特点&#xff0c;带领大家进入一个虚拟现实的全新世界。 元宇宙虚拟展…...

Day11-Webpack前端工程化开发

Webpack 一 webpack基本概念 遇到问题 开发中希望将文件分开来编写,比如CSS代码,可以分为头部尾部内容,公共的样式。 JS代码也希望拆分为多个文件,分别引入,以后代码比较好维护。 本地图片,希望可以实现小图片不用访问后端,保存在前端代码中就可以了 运行程序时我…...

什么是函数式编程,应用场景是什么

什么是函数式编程&#xff0c;应用场景是什么 函数式编程和面向对象编程一样&#xff0c;是一种编程规范。强调执行的过程而非结果&#xff0c;通过一系列的嵌套的函数调用&#xff0c;完成一个运算过程。它主要有以下几个特点&#xff1a; 1.函数是"一等公民"&…...

Vue3之路由认识

回顾&#xff1a; 原来的vue2路由是通过this. r o u t e 和 t h i s . route和this. route和this.router来控制的。现在vue3有所变化&#xff0c;useRoute相当于以前的this. r o u t e &#xff0c;而 u s e R o u t e r 相当于 t h i s . route&#xff0c;而useRouter相当于t…...

P1775 石子合并(弱化版)(内附封面)

石子合并&#xff08;弱化版&#xff09; 题目描述 设有 N ( N ≤ 300 ) N(N \le 300) N(N≤300) 堆石子排成一排&#xff0c;其编号为 1 , 2 , 3 , ⋯ , N 1,2,3,\cdots,N 1,2,3,⋯,N。每堆石子有一定的质量 m i ( m i ≤ 1000 ) m_i\ (m_i \le 1000) mi​ (mi​≤1000)。…...

企业级Leantime容器化部署完整指南:从架构设计到生产环境最佳实践

企业级Leantime容器化部署完整指南&#xff1a;从架构设计到生产环境最佳实践 【免费下载链接】docker-leantime Official Docker Image for Leantime https://leantime.io 项目地址: https://gitcode.com/gh_mirrors/do/docker-leantime Leantime是一款开源的PHPJavaSc…...

SEO 优化与网站分析有什么关系

SEO优化与网站分析&#xff1a;不可分割的伙伴 在当今数字化时代&#xff0c;拥有一个成功的网站不仅仅是一个企业的门面&#xff0c;更是其吸引客户和拓展市场的重要途径。无论你是初创企业还是成熟的行业巨头&#xff0c;网站的流量和用户体验直接影响着你的商业成功。而在这…...

Aimmy:重新定义游戏公平性,AI技术为视障玩家打造的智能瞄准革命

Aimmy&#xff1a;重新定义游戏公平性&#xff0c;AI技术为视障玩家打造的智能瞄准革命 【免费下载链接】Aimmy Universal Second Eye for Gamers with Impairments (Universal AI Aim Aligner (AI Aimbot) - ONNX/YOLOv8 - C#) 项目地址: https://gitcode.com/gh_mirrors/ai…...

网盘下载速度太慢?8大平台直链解析工具让你告别限速烦恼

网盘下载速度太慢&#xff1f;8大平台直链解析工具让你告别限速烦恼 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天…...

保姆级教程:AI全身全息感知镜像部署,手把手教你实现543点动作捕捉

保姆级教程&#xff1a;AI全身全息感知镜像部署&#xff0c;手把手教你实现543点动作捕捉 1. 引言&#xff1a;全息感知技术的平民化革命 想象一下&#xff0c;只需一台普通电脑&#xff0c;就能实现电影级别的动作捕捉效果——这正是AI全身全息感知技术带来的变革。传统动作…...

使用Prometheus监控GeoIP2-CN:查询延迟与更新状态指标

使用Prometheus监控GeoIP2-CN&#xff1a;查询延迟与更新状态指标 你是否遇到过GeoIP2-CN数据库查询缓慢导致服务延迟&#xff1f;或者因数据库未及时更新造成IP定位错误&#xff1f;本文将详细介绍如何通过Prometheus实现对GeoIP2-CN的全方位监控&#xff0c;包括查询性能指标…...

Karpathy新玩法:AI搭建个人知识库,改写大模型记忆逻辑

【导语&#xff1a;Karpathy推出用AI搭建个人知识库的新玩法&#xff0c;该知识库能自我更新、越用越聪明。其搭建教程涵盖导入数据、前端查看、实际运用等步骤&#xff0c;还转变了大模型记忆逻辑&#xff0c;影响深远。】AI知识库&#xff1a;从“存储工具”到“运行系统”传…...

3个核心优势让Dell G15用户彻底解决散热控制难题:开源替代方案性能优化指南

3个核心优势让Dell G15用户彻底解决散热控制难题&#xff1a;开源替代方案性能优化指南 【免费下载链接】tcc-g15 Thermal Control Center for Dell G15 - open source alternative to AWCC 项目地址: https://gitcode.com/gh_mirrors/tc/tcc-g15 当你的Dell G15游戏本在…...

用FreeCAD模拟机械运动:以旋转把手为例,快速检查零件干涉与间隙

用FreeCAD模拟机械运动&#xff1a;以旋转把手为例&#xff0c;快速检查零件干涉与间隙 在机械设计领域&#xff0c;验证运动机构的可行性是产品开发过程中至关重要的一环。无论是简单的创客项目还是复杂的产品原型&#xff0c;设计师都需要确保各部件在运动过程中不会发生干涉…...

SecGPT-14B惊艳效果:对混淆JavaScript恶意样本的命令解析与行为还原

SecGPT-14B惊艳效果&#xff1a;对混淆JavaScript恶意样本的命令解析与行为还原 1. 网络安全智能化的新标杆 在网络安全领域&#xff0c;恶意脚本分析一直是让安全工程师头疼的难题。传统方法需要人工逐行分析经过多重混淆的JavaScript代码&#xff0c;既耗时又容易遗漏关键细…...