Spring初识
未来的几周时间,大概率我会更新一下Spring家族的一些简单知识。而什么是Spring家族,好多同学还不是很清楚,我先来简单介绍一下吧:
所谓Spring家族,它其实就是一个框架,是基于Servlet再次进行封装的内容。为啥说是再次进行封装呢,就是因为Servlet也是封装的一门用于Web端的技术,他们的基础都是Java。所以说,想要学习Spring,建议大家先去了解一下Java基础语法以及Servlet技术。
Spring是什么
通常意义下,我们所说的Spring就是Spring Framework,这是一个开源框架,有着活跃而庞大的社区。为啥说Java的生态很完善,我认为Spring家族就提供了许多保证生态完善的轮子。而Spring框架由于支持广泛的应用场景,使得Java企业级的应用开发变得更简单。
框架为会啥流行呢?或者换句话说,为啥Spring会有这么庞大的用户量?刚开始使用Java解决某一问题时,代码冗杂而功能不全,而使用一些工具方法就可以使得本来繁杂的代码变得简单,而积聚了众多工具方法的组合,就可以称之为框架,既然有了可以使代码变简单的办法,那么就一定会被更多人所用,自然而然也会流行起来。
用一句话来概括Spring框架:Spring是包含了众多工具方法的IoC容器。
IoC是什么
IoC的全称是Inverson of Control,译为中文就是控制反转。其内容就是对对象的生命周期进行控制反转,结果就是降低耦合。
举个简单的例子来说吧:在传统开发中,A类引用B类,B类引用C类,C类引用D类,因此在A类中需要new一个B类,B类中需要new一个C类,而C类中需要new一个D类,假如D类的构造方法发生了改变,那么随之而来的就是需要去改变ABC三个类的构造方法;但是在Spring开发中,不需要进行new类,而是直接把需要使用类的对象给传进来,这样当D类发生改变时,并不需要去动其他的类,从而减少了许多不必要的麻烦,降低了类与类之间的耦合度。
DI是什么
DI的全称是Dependency Injection,译为中文就是依赖注入。其内容就是IoC容器在运行期间,动态的将某种依赖关系注入到对象当中。
从客观角度来看,IoC和DI描述的都是同一件事,即通过IoC容器,动态的将某种依赖关系注入到对象当中。不同的则是,IoC是一种思想,是从整体层面解释的概念,而DI则表示的是一种技术,用这种依赖注入的技术来控制对象生命周期的反转。
容器是什么
顾名思义,容器就是用来存放物品的一种装置。在Spring中,容器就是用来存放对象的装置。既然是容器,那么就表明其可以放物品,也可以拿物品。因此学习Spring时最核心的就是学会如何将对象存储到Spring中,如何将对象从Spring中取出来。
明白了Spring核心功能,那么它的好处是啥呢?首先将对象存储到IoC容器中就表示将未来所有可能用到的工具都放入仓库中,啥时候用啥时候取就可以了,而用完再放入容器中即可,非常的简单便捷。而传统的开发中new就相当于每次使用工具的时候,都现场制作一把,然后用完以后,直接废弃,下次再用的时候再制作,非常麻烦,这就是Spring开发和传统开发的区别。
Spring的创建和存取
1. 创建
创建一个maven项目
引入Spring-beans(管理对象的模块)和Spring-context(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>
2. 存取
a. 创建一个Bean对象
所谓的Bean对象其实就是Java语言中的一个普通对象。
package org.example;public class User {public String sayHi() {return "hello world";}
}
b. 添加配置文件
在resourse目录添加配置文件spring-config.xml(后缀是xml不可变,但是前缀是可以改变的);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"></beans>
c. 存对象
将Bean对象配置到xml文件中。
<bean id="user" class="org.example.User"></bean>
<!--id表示的是Bean对象的名称,不可重复;而class表示的是对象本身,即包名+类名-->
d. 取对象
读对象的话先要得到Spring对象,再从Spring对象中取Bean对象;获取Spring对象可以使用ApplicationContext。
package org.example;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class App {public static void main(String[] args) {//1. 先得到Spring对象ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");//2. 从Spring对象中得到Bean对象User user = context.getBean("user", User.class);//3. 使用Bean对象System.out.println(user.sayHi());}
}
对于得到Spring对象来说,有两种方法可以得到。
一种就是使用ApplicationContext,另一种方法就是BeanFactory。
package org.example;import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;public class App {public static void main(String[] args) {//1. 先得到Spring对象BeanFactory context = new XmlBeanFactory(new ClassPathResource("spring-config.xml"));//2. 从Spring对象中取到Bean对象User user = context.getBean("user", User.class);//3. 使用Bean对象System.out.println(user.sayHi());}}
ApplicationContext和BeanFactory的异同
相同点:
两者都可以得到Spring对象;
两者都是来自Spring的顶级接口(即可以有很多类来继承他们)。
不同点:
继承关系,从上图可以看出,ApplicationContext是继承了BeanFactory,也就是说ApplicationContext不仅拥有BeanFactory的基础功能,还在其功能之上加了些许其他功能,例如国际化支持、资源访问以及事件传播等,而BeanFactory则只有最基础访问Bean的能力。
性能,ApplicationContext是一次性加载,即程序运行的时候将Bean对象都给加载出来,因此后续访问Bean的时候就会很快,而BeanFactory则是在使用某个对象的时候才进行加载,所有在执行Bean获取的时候会比较慢。
Spring中取对象的三种方法
//第一种方法,使用Bean名称进行获取//当xml中没有出现这个Bean名称时,依然进行强转,那么可能会出现错误User user1 = (User) context.getBean("user");//第二种方法,使用Bean类型来获取//当xml中出现两次及以上,即一个Bean对象但是有好几个名字时,也会报错User user2 = context.getBean(User.class);//第三种方法,使用Bean名称和类型来获取User user3 = context.getBean("user", User.class);
总结
了解了Spring是包含了众多工具方法的IoC容器;
了解了IoC、DI以及容器的思想;
了解了Spring的创建和存取。
上述已经实现了Spring的存取,但是实现方法还是比较复杂,接下来会写一篇关于Spring存取更简单的方式,其中涉及到的内容也比较多,例如有配置文件、五大注解、Bean注解以及三大注入等内容。
相关文章:

Spring初识
未来的几周时间,大概率我会更新一下Spring家族的一些简单知识。而什么是Spring家族,好多同学还不是很清楚,我先来简单介绍一下吧: 所谓Spring家族,它其实就是一个框架,是基于Servlet再次进行封装的内容。为…...

2023全新付费进群系统源码 带定位完整版 附教程
这源码是我付费花钱买的分享给大家,功能完整。 搭建教程 Nginx1.2 PHP5.6-7.2均可 最好是7.2 第一步上传文件程序到网站根目录解压 第二步导入数据库(58soho.cn.sql) 第三步修改/config/database.php里面的数据库地址 第四步修改/conf…...
C# LINQ使用介绍
LINQ(Language-Integrated Query)是C#语言的一个强大特性,它允许开发者用声明性的方式查询和操作数据。LINQ提供了一致的查询体验,无论是操作内存中的对象(如数组或集合),还是操作外部数据源&am…...

【c++】——类和对象(中)——实现完整的日期类(优化)万字详细解疑答惑
作者:chlorine 专栏:c专栏 赋值运算符重载()()():实现完整的日期类(上) 我走的很慢,但我从不后退。 【学习目标】 日期(- - --)天数重载运算符 日期-日期 返回天数 对日期类函数进行优化(不符合常理的日期,负数,const成员)c中重载输入cin和输…...

开源与闭源:大模型时代的技术交融与商业平衡
一、开源和闭源的优劣势比较 1.1 开源 优势: 1.技术共享与吸引人才: 开源促进了技术共享,吸引了全球范围内的人才参与大模型的发展,形成了庞大的开发者社区。 2.推动创新: 开源模式鼓励开发者共同参与,推动…...

C#开发的OpenRA游戏之属性BodyOrientation(6)
C#开发的OpenRA游戏之属性BodyOrientation(6) 在顶层定义里会发现这个属性: ^SpriteActor: BodyOrientation: QuantizeFacingsFromSequence: RenderSprites: SpriteActor是用来定义角色的基本属性,它的第一个属性就是BodyOrientation,这个属性主要用来描述角色的身体的…...

Linux shell编程学习笔记27:tputs
除了stty命令,我们还可以使用tput命令来更改终端的参数和功能。 1 tput 命令的功能 tput 命令的主要功能有:移动更改光标、更改文本显示属性(如颜色、下划线、粗体),清除屏幕特定区域等。 2 tput 命令格式 tput [选…...

【计算机网络笔记】IPv6简介
系列文章目录 什么是计算机网络? 什么是网络协议? 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能(1)——速率、带宽、延迟 计算机网络性能(2)…...

c语言-数据结构-堆
目录 一、二叉树 1、二叉树的概念 2、完全二叉树和满二叉树 3、完全二叉树的顺序存储 二、堆 2、堆的概念与结构 3、堆的创建及初始化 4、堆的插入(小堆) 5、堆的删除 6、显示堆顶元素 7、显示堆里的元素个数 8、测试堆的各个功能 9、 实现堆…...

ROS基础—关于参数服务器的操作
1、rosparam list 获取参数服务器的所有参数。 2、rosparam get /run_id 获取参数的值...

Sql Server 2017主从配置之:事务日志传送
使用事务日志传送模式搭建Sql Server 2017主从同步,该模式有一定的延迟,是通过3个不同的定时任务,将主库的日志同步到从库进行恢复来实现数据库同步操作。 环境准备 两台服务器,配置都是8g2核,50g硬盘,操…...
每日OJ题_算法_双指针_力扣283. 移动零+力扣1089. 复写零
力扣283. 移动零 283. 移动零 - 力扣(LeetCode) 难度 简单 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例…...

WebGl-Blender:建模 / 想象成形 / Blender概念词汇表 / 快捷键
一、理解Blender 欢迎来到Blender!Blender是一款免费开源的3D创作套件。 使用Blender,您可以创建3D可视化效果,例如建模、静态图像,3D动画,VFX(视觉特效)快照和视频编辑。它非常适合那些受益于…...

【C++】【Opencv】cv::warpAffine()仿射变换函数详解,实现平移、缩放和旋转等功能
仿射变换是一种二维变换,它可以将一个二维图形映射到另一个二维图形上,保持了图形的“形状”和“大小”不变,但可能会改变图形的方向和位置。仿射变换可以用一个线性变换矩阵来表示,该矩阵包含了六个参数,可以进行平移…...
WPF实现右键菜单
在WPF中,创建上下文菜单(通常称为“右键菜单”)是通过使用ContextMenu控件来实现的。你可以在XAML中声明上下文菜单,并将其关联到任何FrameworkElement。以下是如何在WPF中实现上下文菜单的基本步骤: 1. 在XAML中定义…...

Java智慧工地SaaS管理平台源码:AI/云计算/物联网
智慧工地是指运用信息化手段,围绕施工过程管理,建立互联协同、智能生产、科学管理的施工项目信息化生态圈,并将此数据在虚拟现实环境下与物联网采集到的工程信息进行数据挖掘分析,提供过程趋势预测及专家预案,实现工程…...

【漏洞复现】通达oa 前台sql注入
漏洞描述 通达OA(Office Automation)是一款企业级协同办公软件,旨在为企业提供高效、便捷、安全、可控的办公环境。它涵盖了企业日常办公所需的各项功能,包括人事管理、财务管理、采购管理、销售管理、库存管理、生产管理、办公自动化等。通达OA支持PC端和移动端使用,可以…...

机器学习笔记 - Ocr识别中的文本检测EAST网络概述
一、文本检测 文本检测简单来说就是找到图像中可以出现文本的区域。例如,请参见下图,其中在检测到的文本周围绘制了绿色边框。 在进行文本检测时,你可能会遇到两种情况 具有结构化文本的图像:这是指具有干净/均匀背景和常规字体的图像。文本大多密集,行结构正确,…...

【SQL server】数据库、数据表的创建
创建数据库 --如果存在就删除 --所有的数据库都存在sys.databases当中 if exists(select * from sys.databases where name DBTEST)drop database DBTEST--创建数据库 else create database DBTEST on --数据文件 (nameDBTEST,--逻辑名称 字符串用单引号filenameD:\DATA\DBT…...
vue的生命周期分别是什么?
Vue的生命周期分为8个阶段,分别是: beforeCreate:实例初始化之后,数据观测 (data observer) 和 event/watcher 事件配置之前被调用。 created:实例已经创建完成后被调用,这时候实例已完成以下的配置&#…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...