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文件中的信息,实例化对象,要求程序不能硬编码,即程序可以通用,针对不同的对象,都可以实例化。仅需修改配置文件,不需要…...

Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...