Spring系列一:spring的安装与使用

文章目录
  • ?? 官方资料
    • ??Spring5下载
    • ??文档介绍
  • ??Spring5
    • ??内容介绍
    • ??重要概念
  • ??快速入门
    • ??Spring操作演示
    • ??类加载路径
    • ??Spring容器结构剖析
    • ??Debug配置
  • ??实现简单基于XML配置程序
    • ??Spring原生容器结构梳理
    • ??作业布置
    • ??Spring课堂练习

在这里插入图片描述


上一篇: 项目实战系列三: 家居购项目 第六部分


?? 欢迎来到 Spring系列一:spring的安装与使用 ??

在本篇文章中,我们将介绍 Spring 框架的安装和基本使用方法。Spring 是一个功能强大且灵活的框架,通过学习 Spring,您可以开发出更加健壮和高效的 Java 应用程序。


?? 本篇需要用到的项目: spring项目源码


?? 官方资料

??Spring5下载

1.进入官网: https://spring.io/

2.这里的版本是Spring5 (Spring框架就是一系列jar包. 即引入jar包, 就可以使用spring)

在这里插入图片描述

3.进入Spring5的github(Spring本身也是GitHub的开源项目)

在这里插入图片描述

下拉找到Access to Binaries, 进入Spring Framework Artifacts

在这里插入图片描述

进入到Spring的仓库(这里有Spring的各个版本的jar包)

在这里插入图片描述

下图②处具体路径 snapshot->org->springframework->spring

在这里插入图片描述

下载网址 https://repo.spring.io/artifactory/snapshot/org/springframework/spring/

在这里插入图片描述在这里插入图片描述

如果下载太慢, 这里也有资源, 无需再去官网下载

各个jar包的含义

在这里插入图片描述

??文档介绍

在线文档

https://docs.spring.io/spring-framework/reference/

离线文档

spring-framework-5.3.8docs eferencehtmlindex.html (解压压缩包, 在文件夹里, 按照路径去找)

离线API

spring-framework-5.3.8docsjavadoc-apiindex.html (解压压缩包, 在文件夹里, 按照路径去找)

??Spring5

??内容介绍

Spring核心学习内容 IOC, AOP, jdbcTemplate, 声明式事务

  1. IOC: 控制反转, 可以管理java对象
  2. AOP: 切面编程
  3. JDBCTemplate: 是spring提供的一套访问数据库的技术. 应用性强, 相对好理解
  4. 声明式事务: 基于ioc/aop实现事务管理
  5. IOC, AOP 是重点同时是难点, 需要时间理解

??重要概念

  1. Spring可以整合其它的框架(解读: Spring是管理框架的框架)

  2. Spring有两个核心的概念: IOC 和 AOP

  3. IOC [Inversion Of Control 反转控制]

  4. 传统的开发模式[JDbcUtils / 反射], 程序------>环境 //程序读取环境配置, 然后自己创建对象
    以连接到数据库为例
    程序员编写程序, 在程序中读取配置信息
    创建对象, 使用对象完成任务

  5. Spring方式
    Spring根据配置文件xml / 注解, 创建对象, 并放入到容器(ConcurrentHashMap). 并且可以完成对象之间的依赖
    当需要使用某个对象实例的时候, 就直接从容器中获取即可
    这样程序员可以更加关注如何使用对象完成相应的业务(以前是new -> 现在是注解 / 配置)

  6. DI - Dependency Injection依赖注入, 可以理解成是IOC的别称
    Spring最大的价值是 通过配置, 给程序员提供需要使用的对象web层[Servlet (Action/Controller)/ Service / Dao / JavaBean(entity)]对象
    这是核心价值所在, 也是ioc的具体体现, 实现解耦

??快速入门

??Spring操作演示

需求: 通过Spring的方式[配置文件], 获取JavaBean-Monster的对象, 并给该对象的属性赋值, 输出该对象的信息

1.创建Java工程

在这里插入图片描述

2.新建lib目录, 引入开发Spring5的基本包

在这里插入图片描述

3.创建JavaBeancom.zzw.spring.bean.Monster, 一定要有无参构造器. Spring底层反射创建对象时, 需要使用

public class {private String monsterId;private String name;private String skill;//无参构造器: Spring底层反射创建对象时, 需要使用public Monster() {}//有参构造器, setter, getter, toString()
}

4.src目录下: 新建一个容器配置文件beans.xml

在这里插入图片描述

创建好之后, 右上角进行配置, 不难

在这里插入图片描述

说明: xmlns表示xml namespace, 即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"><!--1.配置monster对象/javabean2.在beans中可以配置多个bean3.bean表示一个java对象4.class是用于指定类的全路径->Spring底层使用反射创建(所以要有无参构造器)5.id属性表示该java对象在spring容器中的id, 通过id可以获取到该对象6.<property name="monsterId" value="100"/> 用于给该对象的属性赋值, String没有赋值就是null--><bean class="com.zzw.spring.bean.Monster" id="monster01"><property name="monsterId" value="100"/><property name="name" value="美猴王"/><property name="skill" value="金箍棒"/></bean>
</beans>

5.测试com.zzw.spring.test.SpringBeanTest

public class SpringBeanTest {@Testpublic void getMonster() {//解读//1.创建容器 ApplicationContext//2.该容器和容器配置文件关联//3.习惯用接口的形式接收ApplicationContext ioc =new ClassPathXmlApplicationContext("beans.xml");//4.通过getBean获取对应的对象//  默认返回的是Object, 但是运行类型是Monster//Object monster01 = ioc.getBean("monster01");Monster monster01 = (Monster) ioc.getBean("monster01");//5.输出System.out.println("monster01" + monster01 + ", monster01运行类型" + monster01.getClass());System.out.println("monster01" + monster01 + ", 属性name=" + monster01.getName() + ", monsterId="+ monster01.getMonsterId());//6.也可以在获取的时候, 直接指定Class类型, 可以再次获取Monster monster011 = ioc.getBean("monster01", Monster.class);System.out.println("monster011=" + monster011);System.out.println("monster011.name=" + monster011.getName());System.out.println("ok~~~");}
}

??类加载路径

解释类加载路径
ApplicationContext ioc = new ClassPathXmlApplicationContext(“beans.xml”);

1.com.zzw.spring.test.SpringBeanTest增加测试方法

//验证类加载路径
@Test
public void classPath() {File file = new File(this.getClass().getResource("/").getPath());//看到类的加载路径System.out.println("file=" + file);
}

2.效果
在这里插入图片描述

??Spring容器结构剖析

判断是否是懒加载: 是事先创建好, 还是等到用户使用的时候再创建.
lazyInit: false. 说明beans.xml中对象的创建不是懒加载.

1.在com.zzw.spring.test.SpringBeanTestgetMonster方法处打断点
用Debug的方式, 看一下Spring容器的处理机制
在这里插入图片描述
ioc->beanFactory->beanDefinitionMap
在这里插入图片描述

beanDefinitionMap / table

在这里插入图片描述
index=217
在这里插入图片描述
table / propertyValues
在这里插入图片描述

beanFactory->singletonObjects
在这里插入图片描述
singletonObjects / table
在这里插入图片描述

beanFactory / beanDefinitionNames
在这里插入图片描述

题目: 查看容器注入了哪些bean对象, 输出bean的id

解答: 在com.zzw.spring.test.SpringBeanTestgetMonster方法里增加下端代码, 测试

String[] beanDefinitionNames = ioc.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {System.out.println("beanDefinitionName=" + beanDefinitionName);
}

??Debug配置

小技巧分享
在这里插入图片描述
在这里插入图片描述

ioc->beanFactory->beanDefinitionMap
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

??实现简单基于XML配置程序

需求说明

  1. 自己写一个简单的Spring容器, 通过读取beans.xml, 获取第1个JavaBean: Monster的对象, 并给该对象的属性赋值, 放入到容器中, 并输出该对象信息
  2. 也就是说, 不使用Spring原生框架, 我们自己简单模拟实现
  3. 了解Spring容器的简单机制

思路分析
在这里插入图片描述

●代码实现
1.引入dom4j-1.6.1.jar包

2.新建com.zzw.spring.zzwapplicationcontext.ZzwApplicationContext.java

/*** @author 赵志伟* @version 1.0* 1.这个程序用于实现Spring的一个简单容器机制* 2.后面还会详细实现* 3.这里我们实现如何将beans.xml文件进行解析, 并生成对象, 放入容器中* 4.提供一个方法 getBean(id) 返回对应的对象* 5.这里就是一个开胃小点心, 理解Spring容器的机制*/
@SuppressWarnings({"all"})
public class ZzwApplicationContext {private ConcurrentHashMap<String, Object> singletonObjects = new ConcurrentHashMap<>();//构造器//接收一个容器的配置文件 比如 beans.xml, 该文件默认在src目录下public ZzwApplicationContext(String iocBeanXmlFile) throws Exception {//1.得到类加载路径:// /D:/idea_project/zzw_spring/spring/out/production/spring/String path = this.getClass().getResource("/").getPath();//2.创建解析器SAXReader reader = new SAXReader();//3.得到document对象Document document = reader.read(new File(path + iocBeanXmlFile));//4.获取rootElementElement rootElement = document.getRootElement();//5.得到第1个bean-monster01Element bean = (Element) rootElement.elements("bean").get(0);//6.获取第一个bean-monster01的相关属性 => beanDefinitionMapString id = bean.attributeValue("id");String ClassFullPath = bean.attributeValue("class");List<Element> properties = bean.elements("property");//这里不再遍历, 直接获取Integer monsterId = Integer.parseInt(properties.get(0).attributeValue("value"));String name = properties.get(1).attributeValue("value");String skill = properties.get(2).attributeValue("value");//7.使用反射创建对象 => 回顾反射机制Class<?> aClass = Class.forName(ClassFullPath);//这里instance就是Monster对象Monster o = (Monster) aClass.newInstance();//给o对象通过反射来赋值 => 这里先简化o.setMonsterId(monsterId);o.setName(name);o.setSkill(skill);//8.将创建好的对象放入到singletonObjectssingletonObjects.put(id, o);}public Object getBean(String id) {//这里可以再处理一下return singletonObjects.get(id);}//加上泛型public <T> T getBean(String beanName, T t) {return (T) singletonObjects.get(beanName);}
}

3.测试 com.zzw.spring.ZzwApplicationContextTest

public class ZzwApplicationContextTest {public static void main(String[] args) throws Exception {ZzwApplicationContext ioc = new ZzwApplicationContext("beans.xml");Monster monster01 = (Monster) ioc.getBean("monster01");System.out.println("monster01=" + monster01);System.out.println("monster01.name=" + monster01.getName());System.out.println("ok~");}
}

??Spring原生容器结构梳理

在这里插入图片描述

??作业布置

问: 在beans.xml中, 注入两个Monster对象, 但是不指定id, 运行会不会报错 如果不会报错. 如何知道id, 并获取Monster对象.

<bean class="com.zzw.bean.Monster"><property name="monsterId" value="200"/><property name="name" value="牛魔王"/><property name="skill" value="芭蕉扇"/>
</bean><bean class="com.zzw.bean.Monster"><property name="monsterId" value="300"/><property name="name" value="金角大王"/><property name="skill" value="紫金红葫芦"/>
</bean>

答:
1.不会报错, 会正常运行
2.系统会默认分配id. 分配id的规则是: 全类名#0, 全类名#1 这样的规则来分配id的. 例如 com.zzw.spring.bean.Monster#0, com.zzw.spring.bean.Monster#1

在这里插入图片描述
3.让我们通过debug方式来查看

●代码实现
1.测试src/com/zzw/spring/test/SpringBeanTest.java

public class SpringBeanTest {@Testpublic void getMonster() {//1.创建容器, 习惯用接口的形式接收ApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");Monster monster1 = ioc.getBean("com.zzw.spring.bean.Monster#0", Monster.class);System.out.println("monster1=" + monster1);Monster monster2 = ioc.getBean("com.zzw.spring.bean.Monster#1", Monster.class);System.out.println("monster2=" + monster2);System.out.println("ok~");}
}

??Spring课堂练习

创建一个Car类, 要求
1.创建ioc容器文件(配置文件), 并配置一个Car对象(bean).
2.通过java程序到ioc容器获取该bean对象, 并输出

1.新建com.zzw.spring.bean.Car

public class Car {private Integer id;private String name;private Double price;public Car() {System.out.println("car对象 无参构造器被执行");}//有参构造器, setter, getter, toString()

2.新建src/beans1.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"><!--配置carbean--><bean class="com.zzw.spring.bean.Car" id="car01"><property name="id" value="100"/><property name="name" value="奔驰"/><property name="price" value="120000.00"/></bean>
</beans>

3.测试src/com/zzw/spring/test/SpringBeanTest.java

@Test
public void getCar() {//1.创建容器对象ApplicationContext ioc = new ClassPathXmlApplicationContext("beans1.xml");Car car01 = ioc.getBean("car01", Car.class);System.out.println("car01=" + car01);System.out.println("car01.name=" + car01.getName());System.out.println("ok~");}
}

在这里插入图片描述


?? 下一篇预告: Spring系列二:基于XML配置bean 上


?? 目录导航 ??

  1. Spring系列一:spring的安装与使用
  2. Spring系列二:基于XML配置bean 上
  3. Spring系列二:基于XML配置bean 中
  4. Spring系列二:基于XML配置bean 下
  5. Spring系列三:基于注解配置bean 上
  6. Spring系列三:基于注解配置bean 中
  7. Spring系列三:基于注解配置bean 下

?? 读者互动 ??
在学习 Spring 安装与使用的过程中,您有哪些新的发现或疑问?欢迎在评论区留言,让我们一起讨论吧!??


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

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

相关文章

AutoSar架构学习笔记

1.AUTOSAR&#xff08;Automotive Open System Architecture&#xff0c;汽车开放系统架构&#xff09;是一个针对汽车行业的软件架构标准&#xff0c;旨在提升汽车电子系统的模块化、可扩展性、可重用性和互操作性。AUTOSAR的目标是为汽车电子控制单元&#xff08;ECU&#xf…

Kernel Stack栈溢出攻击及保护绕过

前言 本文介绍Linux内核的栈溢出攻击&#xff0c;和内核一些保护的绕过手法&#xff0c;通过一道内核题及其变体从浅入深一步步走进kernel世界。 QWB_2018_core 题目分析 start.sh qemu-system-x86_64 \-m 128M \-kernel ./bzImage \-initrd ./core.cpio \-append "…

【顶刊TPAMI 2025】多头编码(MHE)之Part 6:极限分类无需预处理

目录 1 标签分解方法的消融研究2 标签分解对泛化的影响3 讨论4 结论 论文&#xff1a;Multi-Head Encoding for Extreme Label Classification 作者&#xff1a;Daojun Liang, Haixia Zhang, Dongfeng Yuan and Minggao Zhang 单位&#xff1a;山东大学 代码&#xff1a;https:…

友元和运算符重载

1. 友元 可以把某些选定的函数看作类的“荣誉函数”&#xff0c;允许它们访问类对象中非公共的成员&#xff0c;就好像它们是类的成员一样&#xff0c;这种函数称为类的友元。友元可以访问类对象的任意成员。 1.1 友元函数 友元函数是一种定义在类外部的普通函数&#xff0…

Git 树形图表不显示问题

注册表修改 ## 注册表 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers 生效 右键重启 windows资源管理器

【MySQL基础篇】三、表结构的操作

文章目录 Ⅰ. 创建表1、语法2、创建表样例3、创建和其它表一样结构的表 Ⅱ. 查看表结构1、查看数据库中的表2、查看指定表的属性3、获取表的创建语句 Ⅲ. 删除表Ⅳ. 修改表结构1、向表中插入新的字段2、删除表中的字段3、修改表名4、修改字段属性 Ⅰ. 创建表 1、语法 create …

aws(学习笔记第二十二课) 复杂的lambda应用程序(python zip打包)

aws(学习笔记第二十二课) 开发复杂的lambda应用程序(python的zip包) 学习内容&#xff1a; 练习使用CloudShell开发复杂lambda应用程序(python) 1. 练习使用CloudShell CloudShell使用背景 复杂的python的lambda程序会有许多依赖的包&#xff0c;如果不提前准备好这些python的…

SAP SD销售模块常见BAPI函数

【SAP系统研究】 #SAP #SD #销售管理 1、销售订单 BAPI_SALESORDER_CREATEFROMDAT2 创建销售订单 BAPI_CUSTOMERRETURN_CREATE 创建退货订单 SD_SALESDOCUMENT_CREATE 创建贷项订单 BAPI_SALESORDER_CHANGE 修改销售订单 STATUS_READ 查看销售订单状态VB销售订单000000 I_CHA…

CSS学习记录21

CSS 工具提示 通过CSS 创建工具提示&#xff08;Tooltip)。 当用户将鼠标指针移动到元素上时&#xff0c;工具提示通常用于提供关于某内容的额外信息&#xff1a; <style> /* Tooltip 容器 */ .tooltip {position: relative;display: inline-block;border-bottom: 1px …

DuckDB:密钥管理器及其应用

密钥管理器(Secrets Manager)为所有使用密钥的后端提供了统一的用户界面。密钥信息可以被限定范围&#xff0c;因此不同的存储前缀可以有不同的密钥信息&#xff0c;例如允许在单个查询中连接跨组织的数据。密钥也可以持久化&#xff0c;这样就不需要在每次启动DuckDB时都指定它…

[cg] android studio 无法调试cpp问题

折腾了好久&#xff0c;native cpp库无法调试问题&#xff0c;原因 下面的Deploy 需要选Apk from app bundle!! 另外就是指定Debug type为Dual&#xff0c;并在Symbol Directories 指定native cpp的so路径 UE项目调试&#xff1a; 使用Android Studio调试虚幻引擎Android项目…

uni-app深度解码:跨平台APP开发的核心引擎与创新实践

在当今数字化浪潮中&#xff0c;移动应用市场呈现出爆炸式增长。为了满足不同用户群体在不同操作系统上的需求&#xff0c;跨平台 APP 开发成为众多开发者的首选策略。uni-app 作为一款领先的跨平台开发框架&#xff0c;以其独特的优势和创新的实践在众多同类产品中脱颖而出。它…

I2C(一):存储器模式:stm32作为主机对AT24C02写读数据

存储器模式&#xff1a;在HAL库中&#xff0c;I2C有专门对存储器外设设置的库函数 I2C&#xff08;一&#xff09;&#xff1a;存储器模式的使用 1、I2C轮询式写读AT24C02一页数据2、I2C轮询式写读AT24C02多页数据3、I2C中断式写读AT24C02一页数据4、I2C使用DMA式写读AT24C02一…

Elasticsearch:减少 Elastic 容器镜像中的 CVE(常见的漏洞和暴露)

作者&#xff1a;来自 Elastic Maxime Greau 在这篇博文中&#xff0c;我们将讨论如何通过在 Elastic 产品中切换到最小基础镜像并优化可扩展漏洞管理程序的工作流程来显著减少 Elastic 容器镜像中的常见漏洞和暴露 (Common Vulnerabilities and Exposures - CVEs)。 基于 Chai…

【AI学习】Transformer深入学习(二):从MHA、MQA、GQA到MLA

前面文章&#xff1a; 《Transformer深入学习&#xff08;一&#xff09;&#xff1a;Sinusoidal位置编码的精妙》 一、MHA、MQA、GQA 为了降低KV cache&#xff0c;MQA、GQA作为MHA的变体&#xff0c;很容易理解。 多头注意力&#xff08;MHA&#xff09;&#xff1a; 多头注…

使用python调用翻译大模型实现本地翻译【exe客户端版】

以前分享过一个 关于python 部署 网页端的 翻译大模型的 文章 有兴趣的小伙伴可以去看一下 https://blog.csdn.net/Drug_/article/details/144488795 今天就再分享一个 使用python 来制作一个 exe 客户端版的 本地大模型。 实际也很简单 只不过把 用 fastApi 框架 做的 网页端…

python3GUI--智慧交通监控与管理系统 By:PyQt5

文章目录 一&#xff0e;前言二&#xff0e;预览三&#xff0e;软件组成&技术难点1.软件组成结构2.技术难点3.项目结构 四&#xff0e;总结 大小&#xff1a;35.5 M&#xff0c;软件安装包放在了这里! 一&#xff0e;前言 博主高产&#xff0c;本次给大家带来一款我自己使…

JavaVue-Get请求 数组参数(qs格式化前端数据)

前言 现在管理系统&#xff0c;像若依&#xff0c;表格查询一般会用Get请求&#xff0c;把页面的查询条件传递给后台。其中大部分页面会有日期时间范围查询这时候&#xff0c;为了解决请求参数中的数组文件&#xff0c;前台就会在请求前拦截参数中的日期数组数据&#xff0c;然…

Vue2/Vue3使用DataV

Vue2 注意vue2与3安装DataV命令命令是不同的Vue3 DataV - Vue3 官网地址 注意vue2与3安装DataV命令命令是不同的 vue3vite 与 Vue3webpack 对应安装也不同vue3vite npm install kjgl77/datav-vue3全局引入 // main.ts中全局引入 import { createApp } from vue import Da…

RocketMQ消费者如何消费消息以及ack

1.前言 此文章是在儒猿课程中的学习笔记&#xff0c;感兴趣的想看原来的课程可以去咨询儒猿课堂 这篇文章紧挨着上一篇博客来进行编写&#xff0c;有些不清楚的可以看下上一篇博客&#xff1a; https://blog.csdn.net/u013127325/article/details/144934073 2.broker是如何…