Spring的创建与使用
目录
1.创建 Spring 项⽬
1.1 创建一个 maven 项目
1.2 添加 spring 框架支持(spring-context/spring-beans)
2.将 Bean (对象) 存储到 Spring (容器) 中
2.1 在resources中创建一个spring配置文件
2.2 将 Bean 对象存储到 Spring 当中
2.2.1 创建 Bean 对象
2.2.2 将Bean对象配置到spring配置文件中
2.3 从Spring 中读取到Bean对象
2.3.1 得到 Spring (上下文)对象
2.3.2 取出 Bean 对象
3.ApplicationContext与BeanFactory
3.1 经典面试问题: ApplicationContext 与 BeanFactory 有什么区别?
3.2 ApplicationContext与BeanFactory的加载问题
1.创建 Spring 项⽬

1.1 创建一个 maven 项目

输入项目名就可以了
1.2 添加 spring 框架支持(spring-context/spring-beans)
先配置镜像国内源

接下来我们需要找到setting.xml去配置国内源

在setting.xml中找到<mirrors>添加一个阿里云的url
<mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror>
然后再添加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>
(3) 创建一个启动类并添加 main

2.将 Bean (对象) 存储到 Spring (容器) 中
存储 Bean 对象三步(两步)走
- 如果是第一次添加, 先在 spring 项目中添加配置文件
- 先创建一个 Bean 对象
- 在配置文件中将需要保存到 spring 中的 Bean 对象进行注册
2.1 在resources中创建一个spring配置文件

不管html,xml...只要不是java代码都是资源文件


<?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.2 将 Bean 对象存储到 Spring 当中
2.2.1 创建 Bean 对象

2.2.2 将Bean对象配置到spring配置文件中

id相当于我给bean起了一个别名/名称(不能重复,相当于主键)
类似于:域名
class相当于对象本身:包名+类名
类似于:IP
我们可以通过直接访问class,但是通常情况下对象本身是复杂的(包名是非常的长且复杂的),我们可以像IP一样,因为IP不好记,我们可以通过访问域名一样来访问IP
这里我们就是通过访问id来访问对象

2.3 从Spring 中读取到Bean对象

2.3.1 得到 Spring (上下文)对象

ApplicationContext:来自于spring framework,是jar包底下的,就代表spring本身,因为它来自于spring,使用可以说就是spring的化身
这里的new ClassPathXmlApplicationContext("spring-config.xml")意思是通过xml的方式来得到spring的上下文对象


2.3.2 取出 Bean 对象
1.根据 Bean 的名称(标识)来得到 Bean 对象的


到了我们后期的Spring学习中我们可以把所有的对象都创建好,在我们需要使用的时候直接拿就好了
spring的加载是懒加载,虽然我们已经把类放给spring了,但是不是在spring使用的时候就会加载,只有真正调用的时候才加载不使用的时候是不会占用资源的,是不会加载的
2.根据 Bean 类型来获取 Bean
直接返回泛型,不用强转了
![]()
这样的方法还是存在问题的

当xml配置文件当中,一个类包含了多个对象的时候,两则则打起来了

问题:当spring当中存在相同的对象时,使用类型来获取bean的方式就会报错,实际用途并不多
但是实际上对于第一个使用名称来获取对象的方式也是不完美的,当我们getBean()的时候得到的是一个null,并且还要进行强转的时候是会出问题的
3.根据 Bean 名称+Bean类型获取Bean对象

![]()
3.ApplicationContext与BeanFactory
除了ApplicationContext之外,我们还可以使用BeanFactory 来作为Spring的上下文,如下代码示:

3.1 经典面试问题: ApplicationContext 与 BeanFactory 有什么区别?
相同点:
1.都可以得到spring上下文对象/Ioc容器
2.都来自spring的顶级接口
不同点:
1.继承关系和功能: ApplicationContext属于BeanFactory 的子类;BeanFactory只有最基础访问Bean 的能力,而ApplicationContext除了拥有BeanFactory功能之外,还包含了更多的功能,如:国际化支持、资源访问、事件传播等。
2.性能: ApplicationContext 加载方式是将Bean对象一次性加载,所以在后面访问Bean对象时会很快;BeanFactory需要某个Bean时,采取加载 Bean对象,所以它在执行 Bean获取时,比较慢,因此更为轻量。
3.2 ApplicationContext与BeanFactory的加载问题
到这里我不禁会问,ApplicationContext不是懒加载吗,为什么会一次性加载呢?
ApplicationContext 是根据设备的硬件条件以及综合情况来决定,在初始化的时候加载多一些还是少一些的,当spring判断你的条件就比较差的时候会优先加载重要的部分,甚至懒加载;但是当我们使用服务器的时候,内存资源和CPU资源都是很丰富的他就会转换另一种策略,牺牲资源换取速度。
包括他也会根据你的需求来判断的,像我这次写的代码的需求根据你的代码spring来进行优化和配置是一个智能的分配,所需要的内存和其他条件不是很大的情况下,他还是实现一次性加载(饿汉模式)当内存等资源不够用的时候就是懒汉模式了
实例:
当我们使用的是BeanFactory的时候
我们在User类中添加构造方法
//普通 Bean 对象
public class User {public User(){System.out.println("这里是User的构造方法!");}public String sayHi(){return "Hello,World!";}
}
同时我们修改App中的代码如:
public class APP {public static void main(String[] args) {// 1.先得到 spring 对象BeanFactory context = new XmlBeanFactory(new ClassPathResource("spring-config.xml"));System.out.println("准备开始得到 Bean 对象了");// 2.从 spring 中取出 bean 对象User user = context.getBean("user",User.class);//根据 Bean 名称+Bean类型获取Bean对象// 3.使用Bean(可选)System.out.println(user.sayHi());}
}
我们得到的结果是

从这里我们不难看出 BeanFactory 是懒加载的方式,在需要 Bean 时才加载
对于BeanFactory
BeanFactory context = new XmlBeanFactory(new ClassPathResource("spring-config.xml"));是spring初始化的过程
spring初始化好了之后是没有去加载对象的,只有它调用getBean()的时候才加载对象的,说明BeanFactory是懒汉模式
当我们修改App代码如:
public class APP {public static void main(String[] args) {// 1.先得到 spring 对象ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");System.out.println("准备开始得到 Bean 对象了");// 2.从 spring 中取出 bean 对象User user = context.getBean("user",User.class);//根据 Bean 名称+Bean类型获取Bean对象// 3.使用Bean(可选)System.out.println(user.sayHi());}
}
我们得到的结果为

这里可以看出 ApplicationContext 是一次性加载并初始化所有 Bean 对象了
ApplicationContext的spring是先加载的,在加载的时候new了那个对象,是一起执行的,先启动自身的类,然后去将xml重的类给实例化保存到spring中
在System.out.println("准备开始得到 Bean 对象了");打印之前
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
System.out.println("准备开始得到 Bean 对象了");
就是整个spring的启动过程,当实例化完了实例对象后才打印,这就是ApplicationContext
相关文章:
Spring的创建与使用
目录 1.创建 Spring 项⽬ 1.1 创建一个 maven 项目 1.2 添加 spring 框架支持(spring-context/spring-beans) 2.将 Bean (对象) 存储到 Spring (容器) 中 2.1 在resources中创建一个spring配置文件 2.2 将 Bean 对象存储到 Spring 当中 2.2.1 创建 Bean 对象 2.2.2 将B…...
抖音Flutter插件的使用
Flutter是一个开源的移动应用程序开发框架,由谷歌开发,支持Android和iOS。随着Flutter的发展和成熟,许多人开始使用它来开发跨平台应用程序。本文将介绍如何使用抖音的Flutter插件,以增强Flutter应用程序的功能。 1. 安装Flutter…...
Debezium报错处理系列之六十八:No resolvable bootstrap urls given in bootstrap.servers
Debezium报错处理系列之六十八:No resolvable bootstrap urls given in bootstrap.servers 一、完整报错二、错误原因三、解决方法Debezium报错处理系列一:The db history topic is missing. Debezium报错处理系列二:Make sure that the same history topic isn‘t shared b…...
Python二级编程:分词去重
一、原题 参考编程模板,完善代码,实现以下功能。 利用 jieba 库实现中文分词。对分词后的列表进行去重处理,然后将分词结果中字符数大于等于 3 的词语&…...
Android Wifi开发——Wifi锁(十九)
有的时候我们需要 APP 在手机后台运行,但是会遇到手机一旦息屏或者断网,APP 无法正常运行的情况,这是因为手机屏幕关闭之后,并且其他的应用程序没有在使用 Wifi 的时候,系统大概在两分钟之后,会关闭 Wifi,使得 Wifi 处于睡眠状态。而 Wifi 锁 就是 Android 锁屏后 Wifi …...
Nginx的优化与防盗链
目录 一. 隐藏版本号方法一:配置文件隐藏版本号方法二:源代码隐藏版本号 修改用户与组缓存时间日志切割连接超时更改进程数配置网页压缩配置防盗链fpm参数优化 一. 隐藏版本号 可以使用 Fiddler 工具抓取数据包,查看 Nginx版本,也…...
STP协议
目录 STP的基本概念: 桥ID(Bridge ID): 根桥: 开销(Cost): RPC(根路径开销): Port ID: BPDU:(网桥协议…...
方法——检查参数的有效性
检查参数的有效性 绝大多数方法和构造方法对于传递给它们的参数都会有某些限制,比如对象引用不能为null,比如必须是正数等.你应该在文档中(或者注释中)清楚地指出所有这些限制,并且在方法体的开头检查参数,并且强制施加这些限制.如果做不到这一点,检测出错误的可能性就很小,即…...
七、Docker仓库之nexus搭建(四)
Nexus简介 使用 Docker 官方的 Registry 创建的仓库面临一些维护问题。比如某些镜像删除以后空间默认是不会回收的,需要一些命令去回收空间然后重启 Registry。在企业中把内部的一些工具包放入 Nexus 中是比较常见的做法,最新版本 Nexus3.x 全面支持 Doc…...
MySQL 锁机制
1.概述 锁是计算机协调多个进程或线程并发访问某一种资源的机制。 在数据库中,除去计算机硬件资源(CPU、RAM、I/O等)的争用外,数据也是一种供许多用户共享的资源。如何保证并发访问数据的一致性、有效性是所有数据库必须解决的一…...
HACKER KID: 1.0.1实战演练
文章目录 HACKER KID: 1.0.1实战演练一、前期准备1、相关信息 二、信息收集1、端口扫描2、访问网站3、扫描目录4、查看源码5、请求参数6、burpsuite批量请求7、编辑hosts文件8、DNS区域传输9、编辑hosts10、访问网站11、注册账号12、burpsuite抓包13、XML注入14、解密15、登录网…...
Android车载学习笔记1——车载整体系统简介
一、汽车操作系统 汽车操作系统包括安全车载操作系统、智能驾驶操作系统和智能座舱操作系统。 1. 安全车载操作系统 安全车载操作系统主要面向经典车辆控制领域,如动力系统、底盘系统和车身系统等,该类操作系统对实时性和安全性要求极高,生态…...
Apache Doris
Apache Doris教程 1.Doris 简介 1.1 Doris 概述 Apache Doris 由百度大数据部研发(之前叫百度 Palo,2018 年贡献到 Apache 社区后, 更名为 Doris ),在百度内部,有超过 200 个产品线在使用,…...
GB28181 对接海康平台,解决音视频卡顿问题
GB28181 对接海康平台,解决音视频卡顿问题 一、概述二、问题分析1、设备对比分析2、抓包对比分析3、验证分析结果三、总结四、讨论一、概述 设备使用GB28181协议对接海康平台时,发现音频和视频存在卡顿现象,不是一直卡顿,有时候卡有时候不卡,但是卡顿的时候音视频一起卡顿…...
Linux系统编程面试题
1. 什么是系统调用?它与普通函数调用有什么不同? 系统调用和普通函数调用的区别在于它们执行的上下文和权限不同。系统调用是操作系统内核提供的一组接口,允许用户程序请求操作系统执行特权操作,例如打开或关闭文件、创建新进程等…...
计算机网络 - 网络层的数据平面
Overview 首先Network Layer负责的是host to host的传输, 然后可以分为两个平面, 控制平面以及数据平面. 数据平面: 负责forward datagrams from input to output links 决定路由器从input到output 转发功能: 基于目标地址 转发表 SDN方式基于多个字段流表 控制平面: 调…...
《Spring Guides系列学习》guide41 - guide45
要想全面快速学习Spring的内容,最好的方法肯定是先去Spring官网去查阅文档,在Spring官网中找到了适合新手了解的官网Guides,一共68篇,打算全部过一遍,能尽量全面的了解Spring框架的每个特性和功能。 接着上篇看过的gu…...
数据库基础——1.数据库概述
从这篇文章我们开始学习数据库的相关知识 目录 1.为什么要使用数据库 2.数据库与数据库管理系统 2.1相关概念 2.2数据库与数据库管理系统的关系 编辑2.3常见的数据库管理系统 2.4常见的数据库介绍 3.MySQL介绍 3.1概述 3.2关于MySQL8.0 3.3 Oracle vs MySQL 4.RD…...
2023 光亚展|乐鑫将携 AI、Wi-Fi 6、私有云和 Matter 方案精彩亮相
2023 广州国际照明展览会(光亚展)将于 6 月 9 至 12 日在广州琶洲展馆启幕。本届展会以“光未来”为主题,畅想未来生活方式的无限可能。乐鑫科技 (688018.SH) 将在 B 区 9.2 号厅 D55 展位,带来具有前瞻性的智能照明解决方案和实体…...
用反射设计通用的实例化对象方案
需求 对象的相关信息存储在javabean.properties文件中,通过读取properties文件中的信息,实例化对象,要求程序不能硬编码,即程序可以通用,针对不同的对象,都可以实例化。仅需修改配置文件,不需要…...
【限时技术解密】Midjourney未公开的饱和度隐式约束机制:基于2372条训练图像元数据逆向推演的4项硬性规则
更多请点击: https://intelliparadigm.com 第一章:Midjourney饱和度调整的底层认知重构 传统图像处理中,饱和度常被简化为“色彩强度调节滑块”,但在 Midjourney 的扩散生成范式下,饱和度并非独立通道参数࿰…...
布里渊散射与机器学习势场协同表征MOF力学性能
1. 项目概述:当布里渊散射遇见机器学习势场在材料科学的前沿探索中,我们常常面临一个核心挑战:如何精确、无损地获取复杂材料的本征力学性能,尤其是那些结构精巧但晶体尺寸微小的新材料。金属有机框架(MOFs)…...
DriverStore Explorer终极指南:Windows驱动管理的完整实用方案
DriverStore Explorer终极指南:Windows驱动管理的完整实用方案 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 你是否曾为Windows系统盘空间不断减少而烦恼?是否…...
基于SVD/HOSVD与DLinear的流体场高分辨率预测模型解析
1. 项目概述:当流体动力学遇上智能预测在计算流体动力学(CFD)和科学机器学习(SciML)的交叉领域,我们每天都在和数据洪流搏斗。一次高保真度的湍流模拟,动辄产生TB级的高维时空数据——速度场、压…...
小电视空降助手:终极B站广告跳过插件完整指南
小电视空降助手:终极B站广告跳过插件完整指南 【免费下载链接】BilibiliSponsorBlock 一款跳过小电视视频中恰饭片段的浏览器插件,移植自 SponsorBlock。A browser extension to skip sponsored segments in videos, ported from the SponsorBlock 项目…...
差分隐私矩阵机制与FFT优化:保护多轮迭代计算的高效方法
1. 差分隐私矩阵分解:从理论到工程实践在联邦学习、推荐系统这些需要频繁进行多轮迭代计算的场景里,我们常常面临一个核心矛盾:既要利用全体参与者的数据来训练一个高质量的全局模型,又要确保任何单个参与者的敏感信息不会在训练过…...
Oracle EBS的退货处理逻辑
1.1日库存数量1个 价格20元 库存价值1*2020元,采用移动平均成本法2.1日PO1 采购价格 10元 数量3个 入库3个 此时库存价值为 203*1050元 平均价格为 50/412.5元3.1日PO2 采购价格 20元 数量6个 入库6个 此时库存价值为 203020*6170元 平均价格为 170/1017元5.1日PO1 …...
Unity低耦合可复用交互系统设计与实现
1. 为什么“交互系统”在Unity项目里总变成一锅粥?你有没有遇到过这样的场景:美术同事改了个按钮位置,UI脚本里硬编码的transform.Find("Button")就报空引用;策划临时加个新交互逻辑,程序员得翻遍PlayerCont…...
【Android】Hypic 醒图国际版 最新版-免登录
【Android】Hypic 醒图国际版 最新版-解锁永久会员-免登录 链接:https://pan.xunlei.com/s/VOtJaC8K4sK_rrqnINu3HULdA1?pwddfdj# Hypic醒图国际版是一款功能强大的照片编辑应用程序,专为满足专业摄影师和业余爱好者的多样化需求而设计。...
【收藏干货】2026 版大模型推理底层原理拆解!吃透 Prefill/Decode 与 vLLM 核心优化
近两年大模型技术飞速迭代,全面重构了 AI 应用开发体系。日常开发中大家热议模型参数规模、Agent 智能体、多模态交互能力,可真正落地部署上线后,决定产品最终使用体验的核心,往往并非模型本身性能,而是容易被忽略的大…...


